首页 > 编程 > Java > 正文

Java匿名内部类使用局部变量

2019-11-06 07:35:05
字体:
来源:转载
供稿:网友

java8之前,我们在匿名内部类或者局部内部类中使用局部变量都需要将局部变量声明为final,这是因为java底层给我们做了一些小动作,匿名内部类表面上没有构造函数,其实是有的,底层直接将局部变量通过构造函数传给内部类,局部变量在生命周期结束后就会被销毁,而匿名内部类的生命周期一般来说都比局部变量长,那么假如我们可以修改这个变量,就会出现内外不一致的现象(这里的修改指的是改变引用,而不是改变变量的内容),因为外面的局部变量是不会因为内部的引用改变而改变的,所以强制要求声明为final。 但是在Java8中,出现了Effectively final,意思就是,假如这个局部变量我们在使用过程中都不会出现改变引用的情况,那么我们不需要加final,默认是final,如下代码

public class Main { static volatile boolean flag = true; public static void main(String[] args) { Node node = new Node(); new Thread(() -> { node.a = 2; }).start(); } public static class Node { public int a = 1; }}

在Java8编译中编译是不会出错的,然后我们修改一下代码

public class Main { static volatile boolean flag = true; public static void main(String[] args) { Node node = new Node(); new Thread(() -> { node = new Node(); }).start(); } public static class Node { public int a = 1; }}

这时候就会报错,因为我们尝试修改node的值(引用),所以就不是有效final了。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表