1.匿名內(nèi)部類中局部變量的使用
在JDK8中各拷,匿名內(nèi)部類使用局部變量不再要求局部變量使用final修飾,那么是否我們就不會(huì)再發(fā)生Local variable *** defined in an enclosing scope must be final or effectively final 的錯(cuò)誤嗯烤黍,其實(shí)還是會(huì)有的,下面我們看下會(huì)有什么情況依舊編譯報(bào)錯(cuò)初狰。
String str1 = "hello";
new Thread(){
@Override
public void run() {
System.out.println(str1);
}
}.start();
首先在這個(gè)例子里,我們可以看到筝闹,普通的使用一個(gè)局部變量是不要求final修飾的腥光。
但是下面這種對(duì)變量進(jìn)行了初始化賦值,然后再次指向一個(gè)新對(duì)象時(shí)就會(huì)出現(xiàn)問題了议双。
String str2 = null;
/*str2做了判斷再賦值*/
if("hello".equals(str1)){
str2 = "world1";
}else{
str2 = "world2";
}
new Thread(){
@Override
public void run() {
System.out.println(str2);
}
}.start();
此時(shí)的System.out.println(str2)這里就提示編譯報(bào)錯(cuò)了平痰。
這里報(bào)錯(cuò)的原因就是str2這個(gè)變量在編譯器看來伍纫,不再具有唯一性了,更深的底層原理需要再研究莹规。
我們這里講下這種問題的解決棒法良漱。
1: 將變量重新賦值給另外一個(gè)引用。如用str3指向str2的對(duì)象母市,內(nèi)部類里面使用str3就可以了窒篱。
如圖
2: 將對(duì)象做為數(shù)組的一部分,內(nèi)部類中使用數(shù)組獲取對(duì)象再使用也可以解決問題,如圖括荡。
原理都是將我們需要的數(shù)據(jù)重新綁定到一個(gè)編譯器認(rèn)為具有final性的引用里面就可以了畸冲,所以只要知道原理观腊, 也可以自己靈活變動(dòng)解決問題了算行。