局部內部類的成員變量被final修飾才能被局部內部類的方法所訪問
阿新 • • 發佈:2018-01-29
() public 局部內部類 所有 方法的參數 clas 類對象 訪問 保持
public class Demo {
public static void main(String[] args) {
//都能正確運行,因為方法彈棧了,這裏思考的問題是show方法的參數是final
new Test().show(2);
new Test().show(3);
Test t = new Test();
t.show(22);
t.show(33);
}
}
class Test {
int num = 0 ;
public void show(final int b){
final int x = 1;
class Inner{
public void method(){
System.out.println(x);
System.out.println(b);
}
}
new Inner().method();
}
}
為什麽局部內部類的成員被final修飾才能被局部內部類的方法訪問?
因為局部變量會在方法調用完畢後立刻消失,而內部類對象的生命周期和其他對象的生命周期一樣:當沒有引用指向內存地址時,通過垃圾回收機制回收,所以如果局部局部內部類的成員不用final修飾的話,很可能出現方法已經已經調用完畢,內部類還沒有被垃圾回收機制收回,定義為final後,編譯器會把匿名內部類對象要訪問的所有final類型局部變量,都拷貝一份作為該對象的成員變量。這樣,即使棧中局部變量已經死亡,匿名內部類對象照樣可以拿到該局部變量的值,因為它自己拷貝了一份,且與原局部變量的值始終保持一致
局部內部類的成員變量被final修飾才能被局部內部類的方法所訪問