深入理解Java闭包概念
来源:互联网 发布:java 代码保护 编辑:程序博客网 时间:2024/06/07 00:00
闭包又称词法闭包
闭包最早定义为一种包含<环境成分>和<控制成分>的实体.
解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在。
解释二:闭包是函数和相关引用环境组成的实体。
注:<自由变量>:除了局部变量的其他变量
简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量。
Java中闭包实现
关键点:
如何用变量去存储方法?
java中能够保存方法的变量指的就是普通的对象
如何让这个普通对象能够访问所在类的自由变量?
纯天然的解决办法是:内部类。内部类能够访问外部类的所有属性及方法。
隐藏具体实现是内部类的作用之一,如何保证隐藏具体实现的同时还能将闭包传递到外部使用?
让内部类实现通用接口,然后将内部类对象向上转型为接口类型。
上述解决办法就是Java最常用的闭包实现办法(内部类+接口)
下面提供一个简单的实现
public class Milk {public final static String name = "纯牛奶";//名称private static int num = 16;//数量public Milk(){System.out.println(name+":16/每箱");}/** * 闭包 * @return 返回一个喝牛奶的动作 */public Active HaveMeals(){return new Active(){public void drink(){if(num == 0){System.out.println("木有了,都被你丫喝完了.");return;}num--;System.out.println("喝掉一瓶牛奶");}};}/** * 获取剩余数量 */public void currentNum(){System.out.println(name+"剩余:"+num);}}/** * 通用接口 */interface Active{void drink();}
使用上述实现
public class Person {public static void main(String[] args) {//买一箱牛奶Milk m = new Milk();Active haveMeals = m.HaveMeals();//没事喝一瓶haveMeals.drink();//有事喝一瓶haveMeals.drink();//看看还剩多少?m.currentNum();}}
运行结果
纯牛奶:16/每箱喝掉一瓶牛奶喝掉一瓶牛奶纯牛奶剩余:14
上述例子中,通过调用Active的方法实现对Milk私有变量num进行修改。
有时候觉得直接使用set方法也可以直接修改private变量,但是从现实生活中来说让人去执行喝牛奶的动作比牛奶自己动手喝来的合理一些。
总结
1.实际项目中没怎么用过闭包,因此不能对他的好坏进行评论。
2.建议合理的使用闭包,不完全不使用,也不能滥用。
3.特别注意:闭包会导致资源不被回收,如上例,在main方法中将m设为null,使用haveMeals继续调用drink方法仍然会喝掉一瓶牛奶,说明Milk对象并没有被释放掉。
0 0
- 深入理解Java闭包概念
- 深入理解Java闭包概念
- 深入理解Java闭包概念
- 深入理解Java闭包概念
- 深入理解JavaScript闭包概念
- 深入理解Javascript闭包概念
- 深入理解JavaScript闭包概念
- 深入理解闭包
- 深入理解闭包
- 闭包深入理解
- 深入理解闭包
- 深入理解闭包
- 理解闭包的概念
- Javascript闭包概念理解
- javascript理解闭包概念
- 理解Java中【包】的概念
- 深入理解Javascript闭包
- 深入理解Javascript闭包
- 利用Proxy Cache使Nginx对静态资源进行缓存
- IOS 实现录音PCM转MP3格式(边录音边转码)
- OC-对象方法/类方法/self/super(1)
- 修改eclipse中的默认maven2资源仓库保存地址
- ODBC和OLEDB的连接字符串
- 深入理解Java闭包概念
- 6月中国最美的地方!对的时间就要去对的地方!
- 解决PHP中文乱码问题 linux下页面乱码
- 深入理解Java内存模型(二)——重排序
- 编译安装PHP 时遇到问题解决方法.
- 爱加密亮相第十八届软博会,移动App安全引关注
- open cv+C++错误及经验总结(十四)
- x264 - x264_mb_encode_i16x16
- jquery中的each的几种用法