2011-06-05 132 views
5

可能重複:
Cannot refer to a non-final variable inside an inner class defined in a different method
Why inner classes require 「final」 outer instance variables [Java] ?的Java內部類

class MyOuter {  

    private String x = "Outer"; 
    void doStuff(){ 
      final String z = "local variable"; 
      class MyInner { 
       public void seeOuter(){ 
         System.out.println("Outer x is" + x); 
         System.out.println("Local variable z is" + z); // does 
         // not compile if final keyword from String z is removed 
       } 
      } 
    } 
} 

上面的代碼工作正常。 我想知道爲什麼編譯器給出一個錯誤,如果我從字符串z中刪除最後一個關鍵字。最終的關鍵字製作有什麼不同?

回答

3

您的類myInner實際上不能「看到」您引用的方法範圍變量z。編譯器只是給內部類自己的私有副本z。因此,如果以後要更改z,程序可能會以神祕的方式「破解」,因爲代碼使其看起來像是同一個變量。

因此,編譯器不會讓你編寫該代碼,除非你保證你知道z以後不能更改,通過聲明它是最終的。

0

1)zString的引用住在當前線程。現在,讓我們假設在你的內部類中你啓動了一個線程(B)並且你想從B訪問z。但是B沒有訪問A的堆棧。爲了允許這種訪問,Java製作了這個引用的副本。但爲了確保兩個線程都不會改變自己的價值,所以會使這個系統處於不一致的狀態,您必須聲明它是最終的。