主题5:外部变量的引用

jdk1.7及以前:

    在jdk1.7及以前,如果在内部类中引用外部变量,外部变量必须是final修饰的

jdk1.8以后:

    在jdk1.8以后,放宽了外部引用的限制,只要外部变量符合有效只读(初始化后,没有被修改过),就可以被内部类,lambda直接引用但是,在内部类或者lambda中,不能修改外部变量本身,但是可以修改其引用的对象的内部信息。即对值封闭,对引用开放

int sum = 0;
list.forEach(e -> { sum += e.size(); }); // Illegal, close over values
List<Integer> aList = new List<>();
list.forEach(e -> { aList.add(e); }); // Legal, open over variables

this:

匿名内部类中,this引用匿名对象本身, 而在lambda表达式中,this引用外部对象;

this不能引用静态字段;

对 this 的引用,以及通过 this 对字段和方法的调用在本质上都属于使用 final 局部变量。包含此类引用的 lambda 表达式相当于捕获了 this 实例。在其它情况下,lambda 对象不会保留任何对 this 的引用。

类成这个特性对内存管理是一件好事:内部类实例会一直保留一个对其外部类实例的强引用,而那些没有捕获外部员的 lambda 表达式则不会保留对外部类实例的引用。要知道内部类的这个特性往往会造成内存泄露

猜你喜欢

转载自www.cnblogs.com/zyj-468161691/p/12213736.html
今日推荐