2017-01-07 6 views
-2
class outer3 { 
    private String x = "outer"; 

    void dostuff() { 
     String z = "9"; 
     class inner3 { 
      public void f() { 
       System.out.println("x is " + x + "z=" + z); 
      } 
     } 
     inner3 in = new inner3(); 
     in.f(); 
    } 
} 

私はこの1.8.0_65.Is変化のjavacを使用
(zはいえローカル変数である)メソッドローカルインナークラスは、それらがこのコードがうまくコンパイルdeclared.Butする方法のローカルメンバーを使用できないことを読み出しますJavaで、または私はいくつかの間違いを犯す?なぜこの内部クラスコードがコンパイルされますか?

+0

ソースを引用してください。 –

+0

私はkathy sierra scjpガイドを読みましたが、古い版(java 6) –

+2

Java 8で変更されました:http://stackoverflow.com/questions/4732544/why-are-only-final-variables-accessible-in-匿名クラス – Tom

答えて

4

Java SE 8では、ローカルクラスは、最終的または実質的に最終的な囲みブロックのローカル変数およびパラメータにアクセスできます。値が初期化された後に決して変更されない変数またはパラメータは事実上最終的です。

あなたのコード変数zは実質的に最終ですが、 "dostuff"メソッドのz変数の値を変更すると、コンパイルエラーが発生します。

関連する問題