1.匿名内部类中局部变量的使用
在JDK8中,匿名内部类使用局部变量不再要求局部变量使用final修饰,那么是否我们就不会再发生Local variable *** defined in an enclosing scope must be final or effectively final 的错误嗯,其实还是会有的,下面我们看下会有什么情况依旧编译报错。
String str1 = "hello";
new Thread(){
@Override
public void run() {
System.out.println(str1);
}
}.start();
首先在这个例子里,我们可以看到,普通的使用一个局部变量是不要求final修饰的。
但是下面这种对变量进行了初始化赋值,然后再次指向一个新对象时就会出现问题了。
String str2 = null;
/*str2做了判断再赋值*/
if("hello".equals(str1)){
str2 = "world1";
}else{
str2 = "world2";
}
new Thread(){
@Override
public void run() {
System.out.println(str2);
}
}.start();
此时的System.out.println(str2)这里就提示编译报错了。
这里报错的原因就是str2这个变量在编译器看来,不再具有唯一性了,更深的底层原理需要再研究。
我们这里讲下这种问题的解决棒法。
1: 将变量重新赋值给另外一个引用。如用str3指向str2的对象,内部类里面使用str3就可以了。
如图
2: 将对象做为数组的一部分,内部类中使用数组获取对象再使用也可以解决问题,如图。
原理都是将我们需要的数据重新绑定到一个编译器认为具有final性的引用里面就可以了,所以只要知道原理, 也可以自己灵活变动解决问题了。