今日、私は內(nèi)部クラスについて學(xué)び、內(nèi)部クラスが外部クラスの this を保持できるため、OuterClass.this.medthod() を內(nèi)部クラスで使用して、対応する外部クラスのメソッドを參照できることを?qū)Wびました。コードを書いて実行することはできますが、呼び出しロジックがよくわかりません。教えていただければ幸いです。
リーリー設(shè)計は次のようになります。テスト オブジェクトは、新しい Speaker 匿名クラス オブジェクトを作成する Perform メソッドを呼び出します。オブジェクトは、その handleAction メソッドを呼び出します。このメソッドのパラメータは Action インターフェイスであり、インターフェイスはアクション抽象メソッド。テストに付屬のレポートメソッドを使用しました。出力は正常です。
そこで知りたいのですが、テストオブジェクトのメソッドに匿名クラスのローカルオブジェクトがあり、ローカルオブジェクトのパラメータがインターフェースを?qū)g裝した匿名クラスなのですが、なぜこの匿名クラスでレポートが呼び出せるのでしょうか? test.this ポインタを保持していますか?
私の理解では、new Speaker().handleAction(new Action(){....
ここでの実裝ロジックは test.this とは何の関係もなく、test を保持する必要もありません。 。 これ???###
リーリー
new Speaker()
不是匿名內(nèi)部類,它有確切的類名Speakernew Action(){}
是匿名內(nèi)部類,會在編譯的時候給它一個類名(我們假定它的類名叫Test,你可以打印this.getClass()看看)
看出兩者的區(qū)別了嗎?匿名內(nèi)部類多出了個{}。
由于new Action(){}
はテストオブジェクトのスコープ內(nèi)に作成されるため、その外部クラスはTestになります。
匿名內(nèi)部クラスにもコンストラクターがあり、通常のクラスのコンストラクターとは少し異なります。コンパイル時に、匿名內(nèi)部クラスのコンストラクターのパラメーター リストの前に別のパラメーターが挿入されます。このパラメーターはオブジェクトへの參照です。外部クラスのコンパイル クラスは次のようになります:
リーリーnew Action(){...}
実際には、Test$1が作成され、コンストラクターを通じてテストオブジェクト參照がTest$1に渡されます
したがって、匿名の內(nèi)部クラスは外部クラスへの參照を保持し、外部クラスのメソッドを呼び出すことができます