内部类使用外部类局部变量必须是 final 原因

来源:互联网 发布:爱喝啤酒软件 编辑:程序博客网 时间:2024/06/04 23:30

javac工具在编译的时候会做一些处理,具体会在Inner类里存储一份outer变量的拷贝,Inner类里看得见的实际使用outer的地方,实际上只是用的这个拷贝。

而问题是这个拷贝过程只在Inner类定义时进行一次,如果我们在Inner类定义完后的其他地方改变了outer变量,并不会反应在这份拷贝上面。所以为了防止这种不一致的发生,就用强制给outer变量加final修饰符的方式,把上面那种“如果”给禁止了。

内部类里面使用外部类的局部变量时,其实就是内部类的对象在使用它,内部类对象生命周期中都可能调用它,而内部类试图访问外部方法中的局部变量时,外部方法的局部变量很可能已经不存在了,那么就得延续其生命,拷贝到内部类中,而拷贝会带来不一致性,从而需要使用final声明保证一致性。说白了,内部类会自动拷贝外部变量的引用,为了避免:1. 外部方法修改引用,而导致内部类得到的引用值不一致 2.内部类修改引用,而导致外部方法的参数值在修改前和修改后不一致。于是就用 final 来让该引用不可改变。

内部类通常都含有回调,引用那个匿名内部类的函数执行完了就没了,所以内部类中引用外面的局部变量需要是final的,这样在回调的时候才能找到那个变量,而如果是外围类的成员变量就不需要是final的,因为内部类本身都会含有一个外围了的引用(外围类.this)

阅读全文
0 0