0

次のコードがコンパイルに失敗する理由を説明する必要があります (スコープと有効期間の観点から)。

class ClassInMethod
{
   public static void main(String[] args)
   {
      int local = 1;

      class Inner
      {
         public void method()
         {
             System.out.println(local);
         }
      }
   }
}

私はそれが理由だと思います: 内部クラスで使用されているが宣言されていないローカル変数は、「final」と宣言する必要があります。したがって、この例では、スコープと有効期間がメイン メソッド内で終了するため、'local' を final として宣言する必要があります (したがって、次のように変更する必要があります: final int local = 1;)。

他の提案はありますか?

4

3 に答える 3

2

コンパイラfinalがこのトリックを使用して内部クラス (つまり、スコープと一生の問題)。

于 2012-02-05T21:17:48.943 に答える
1

ローカル変数を作成する必要がある理由finalは、Javaがそれらの値を内部クラスのインスタンスにコピーするためです。舞台裏で行われるのは、コンパイラが(おおよそ)これに対応するバイトコードを生成することです。

class ClassInMethod {
    public static void main(String[] args) {
        int local = 1;

        // this happens when you do: new Inner()
        ClassInMethod_main_Inner inner = new ClassInMethod_main_Inner();
        inner.local = local;
    }
}

// the inner class
class ClassInMethod_main_Inner {
    int local;

    public void method() {
        System.out.println(local);
    }
}

そうlocalでない場合、インスタンス化されたときとが呼び出されたときfinalの間でその値を変更できます。への呼び出しは、の古い値を使用します。これはおそらく間違った振る舞いです。義務付けられている理由は、内部クラスの動作をより直感的にするためです。Innermethod()method()localfinal

(この制限がない言語もありますが、コンパイラーとランタイムからの明示的なサポートが必要です。Javaの開発者は、これまでのところ、実装に専念することを決定していません。)

于 2012-02-05T21:22:40.860 に答える
1

コンパイルしてみてください。コンパイラの出力:

ClassInMethod.java:11: ローカル変数 local は内部クラス内からアクセスされます。final を宣言する必要があります
    System.out.println(ローカル);
                       ^
1 エラー
于 2012-02-05T21:15:28.820 に答える