今日、私は内部クラスについて学び、内部クラスが外部クラスの this を保持できるため、OuterClass.this.medthod() を内部クラスで使用して、対応する外部クラスのメソッドを参照できることを学びました。コードを書いて実行することはできますが、呼び出しロジックがよくわかりません。教えていただければ幸いです。
リーリー設計は次のようになります。テスト オブジェクトは、新しい Speaker 匿名クラス オブジェクトを作成する Perform メソッドを呼び出します。オブジェクトは、その handleAction メソッドを呼び出します。このメソッドのパラメータは Action インターフェイスであり、インターフェイスはアクション抽象メソッド。テストに付属のレポートメソッドを使用しました。出力は正常です。
そこで知りたいのですが、テストオブジェクトのメソッドに匿名クラスのローカルオブジェクトがあり、ローカルオブジェクトのパラメータがインターフェースを実装した匿名クラスなのですが、なぜこの匿名クラスでレポートが呼び出せるのでしょうか? test.this ポインタを保持していますか?
私の理解では、new Speaker().handleAction(new Action(){....
ここでの実装ロジックは test.this とは何の関係もなく、test を保持する必要もありません。 。 これ???###
リーリー
new Speaker()
不是匿名内部类,它有确切的类名Speakernew Action(){}
是匿名内部类,会在编译的时候给它一个类名(我们假定它的类名叫Test,你可以打印this.getClass()看看)看出两者的区别了吗?匿名内部类多出了个{}。
由于
new Action(){}
はテストオブジェクトのスコープ内に作成されるため、その外部クラスはTestになります。匿名内部クラスにもコンストラクターがあり、通常のクラスのコンストラクターとは少し異なります。コンパイル時に、匿名内部クラスのコンストラクターのパラメーター リストの前に別のパラメーターが挿入されます。このパラメーターはオブジェクトへの参照です。外部クラスのコンパイル クラスは次のようになります:
リーリー
リーリーnew Action(){...}
実際には、Test$1が作成され、コンストラクターを通じてテストオブジェクト参照がTest$1に渡されますしたがって、匿名の内部クラスは外部クラスへの参照を保持し、外部クラスのメソッドを呼び出すことができます