局部内部类直接访问在其外部定义的对象(包括普通变量),编译器要求参数引用必须是final的。 其中: 1. 必须是局部内部类,显然包括匿名内部类; 2. 内部类访问外部类的对象必须是直接访问。
public class LocalInnerClassUnitTests {
public void defineInnerClass(final int x) {
class MyLocalInnerClass {
public void doSomething() {
System.out.println(x);
}
}
}
}
public class LocalInnerClassUnitTests { public void defineInnerClass(final int x) { class MyLocalInnerClass { public void doSomething() { System.out.println(x); } } }}
像代码中的int x 是本地变量,因为java底层的机制不能存取本地变量,这样导致内部类,没有办法取过来,
所以java直接把本地变量的refrenece拷贝到内部类。
因为这个,所以在编译器里面,加上了一个final,让你不要改变这个值,然你只读不能存,这样感觉就好了
内部类并不是直接调用方法传进来的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,
自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。
这样理解就很容易得出为什么要用final了,因为两者从外表看起来是同一个东西,实际上却不是这样,如果内
部类改掉了这些参数的值也不可能影响到原参数,然而这样却失去了参数的一致性,因为从编程人员的角度来看他
们是同一个东西,如果编程人员在程序设计的时候在内部类中改掉参数的值,但是外部调用的时候又发现值其实没有被改掉。
为了避免这种问题,所以编译器设计人员把内部类能够使用的参数设定为必须是final来规避这种莫名其妙错误的存在 |