1. 程式人生 > >局部內部類的成員變量被final修飾才能被局部內部類的方法所訪問

局部內部類的成員變量被final修飾才能被局部內部類的方法所訪問

() 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修飾才能被局部內部類的方法所訪問