在jdk1.7及以前,如果在内部类中引用外部变量,外部变量必须是final修饰的。
在jdk1.8以后,放宽了外部引用的限制,只要外部变量符合有效只读(初始化后,没有被修改过),就可以被内部类,lambda直接引用;但是,在内部类或者lambda中,不能修改外部变量本身,但是可以修改其引用的对象的内部信息。即对值封闭,对引用开放;
int sum = 0; |
匿名内部类中,this引用匿名对象本身, 而在lambda表达式中,this引用外部对象;
this不能引用静态字段;
对 this 的引用,以及通过 this 对字段和方法的调用在本质上都属于使用 final 局部变量。包含此类引用的 lambda 表达式相当于捕获了 this 实例。在其它情况下,lambda 对象不会保留任何对 this 的引用。
类成这个特性对内存管理是一件好事:内部类实例会一直保留一个对其外部类实例的强引用,而那些没有捕获外部员的 lambda 表达式则不会保留对外部类实例的引用。要知道内部类的这个特性往往会造成内存泄露。
原文:https://www.cnblogs.com/zyj-468161691/p/12213736.html