public class AAa{
public void fun(){
int i =123;
Object obj = new Object();
// i++;
class LocalClass{
public void localFun() {
System.out.println(i); //编译通过,可以访问值类型(修改)
i ++; //编译报错,i必须为final(修改)
obj.hashCode(); //编译通过,可以访问引用类型 (访问)
obj = new Object(); //编译报错,obj 必须为final (修改)
}
}
}
}
在局部内部类里访问局部变量时,局部变量会被默认为是final(即使没有显式的用final修饰),
而此时,如果对这个局部变量做修改操作,则与默认的final相矛盾。
那么问题来了:
Q:为什么JAVA的编译器要做除这种限制呢?
A
:
因为局部内部类最终会被编译为一个单独的类,其所访问的局部变量会成为这个类的属性。如果访问的一个值类型局部变量,就会造成这个类的属性与所访 问的局部变量不是同一个,会造成数据不同步。
所以强制要求局部变量必须为final,避免数据不同步。