2015-01-09 17 views
5

JLS 8.1.3は、内部クラスでは宣言されていないがクラスで使用されている変数に関するルールを提供します。内部クラス内で最終的ではないローカル変数を使用する

任意のローカル変数、仮パラメータ、または使用される例外パラメータが、 が内部クラス内で宣言されていないが、最終的な宣言または有効最終 (§4.12.4)、またはコンパイル時エラーがどこに発生しなければならないのいずれかで 使用が試みられます。

例:

class A{ 
    void baz(){ 
     int i = 0; 
     class Bar{ int j = i; } 
    } 

    public static void main(String[] args){ 
    } 
} 

DEMO

はなぜコードがコンパイルされたのですか?私たちはそこで宣言されていない内部クラスの非最終ローカル変数を使用しました。

答えて

2

変数内で定義された変数i変数iの値が他の場所で変更されていないため、bazは効率的に最終的です。あなたはそれを変更した場合、変数iは、もはやeffictively最終ではありませんが、あなただけの変数iと別の行でそれを初期化を宣言した場合、変数はeffictivelyあるので、コードがコンパイルされますので、

void baz(){ 
     int i = 0; 
     i = 2; 
     class Bar{ int j = i; } 
    } 

コードはコンパイルに失敗します最終

void baz(){ 
     int i; 
     i = 2; 
     class Bar{ int j = i; } 
    } 
1

iは決して変更されていないので効果的です。あなた自身がJLSを引用したように、内部クラスは実際に最終変数を使用するかもしれません。

1

ibazで変更されていないため、実質的に最終的です。

関連する問題