2

重複の可能性:
別のメソッドで定義された内部クラス内の非最終変数を参照できません
なぜ匿名クラスで最終変数にしかアクセスできないのですか?

SO と google を調べて、この質問に対する答えを探しましたが、何も見つかりませんでした。

次のコードがあります。

MyClass variable = new MyClass();
Button b = new Button();
b.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e){
         System.out.println("You clicked the button");
         variable.doSomething();
   }
});

コンパイラはこれを返します:

ローカル変数 variable は内部クラス内からアクセスされます。final を宣言する必要があります

variable最終でなければならない技術的な理由は何ですか?

4

2 に答える 2

6

これは、匿名の内部クラスを使用しているためです。何が起こるかというと、コンパイラがあなたのためにクラスを作成します。それはあなたの外部クラスと呼ばれ、番号などを追加し$ます。$$2

クラスには自動的に初期化された外部クラスへの参照があるため、そのインスタンスは外部クラスのメソッドとフィールドを使用できます。

しかし、あなたのクラスは匿名です。これは一種の内部メソッドで定義されており、この匿名クラスの前に定義され内部変数を使用できます。問題は「どうすればそれができるのか」ということです。実際には、「実行中のメソッドのインスタンス」を参照してその変数にアクセスすることはできません。答えは、匿名内部クラスから参照されるすべてのメソッド変数が匿名内部クラスにコピーされるということです。したがって、変数はfinalである必要があります。そうしないと、誰かが外部クラスから値を変更でき、その変更は内部クラスに表示されません。

于 2012-06-10T15:15:45.883 に答える
0

これは、イベントがトリガーされたときにのみ内部クラスがコードを実行するためです。変数が final と宣言されていない場合、MyClass参照されているオブジェクトvariableが変更される可能性があり、内部クラスは、オブジェクトが必要な場合に参照することになっているオブジェクトを認識できませんMyClass

したがって、この参照が変更されないように final として宣言する必要があります。

final キーワードなしでこれを想像してください:

variableMyClass内部クラスでオブジェクトを参照してhashCode(): 12345 いるが作成され、内部クラスでオブジェクトをvariable参照していますMyClasshashCode(): 12345

variable内部クラスでMyClassObject を参照するように変更されましたが、引き続きObject を参照していますhashCode(): abcde variableMyClasshashCode(): 12345

イベントがトリガーされたときに Java はここからどのようにコードを実行しますか? どのMyClassオブジェクトを使用しますか?

ここで、最後のキーワードを使用します。

variableMyClass内部クラスでオブジェクトを参照してhashCode(): 12345 いるが作成され、内部クラスでオブジェクトをvariable参照していますMyClasshashCode(): 12345

final キーワードのため、参照を変更できません。

Java はMyClass、イベントがトリガーされたときに呼び出すオブジェクトを常に認識しています。問題はありません。

于 2012-06-10T15:11:06.793 に答える