ホームページ  >  に質問  >  本文

oop - Java では、匿名の内部クラスが外部クラスのメソッドを呼び出すことについての疑問

今日、私は内部クラスについて学び、内部クラスが外部クラスの this を保持できるため、OuterClass.this.medthod() を内部クラスで使用して、対応する外部クラスのメソッドを参照できることを学びました。コードを書いて実行することはできますが、呼び出しロジックがよくわかりません。教えていただければ幸いです。

リーリー

設計は次のようになります。テスト オブジェクトは、新しい Speaker 匿名クラス オブジェクトを作成する Perform メソッドを呼び出します。オブジェクトは、その handleAction メソッドを呼び出します。このメソッドのパラメータは Action インターフェイスであり、インターフェイスはアクション抽象メソッド。テストに付属のレポートメソッドを使用しました。出力は正常です。

そこで知りたいのですが、テストオブジェクトのメソッドに匿名クラスのローカルオブジェクトがあり、ローカルオブジェクトのパラメータがインターフェースを実装した匿名クラスなのですが、なぜこの匿名クラスでレポートが呼び出せるのでしょうか? test.this ポインタを保持していますか?
私の理解では、new Speaker().handleAction(new Action(){....ここでの実装ロジックは test.this とは何の関係もなく、test を保持する必要もありません。 。 これ???###

漂亮男人漂亮男人2712日前988

全員に返信(1)返信します

  • PHP中文网

    PHP中文网2017-05-17 10:09:37

    リーリー

    new Speaker()不是匿名内部类,它有确切的类名Speaker
    new Action(){}是匿名内部类,会在编译的时候给它一个类名(我们假定它的类名叫Test,你可以打印this.getClass()看看)
    看出两者的区别了吗?匿名内部类多出了个{}。
    由于new Action(){}はテストオブジェクトのスコープ内に作成されるため、その外部クラスはTestになります。

    匿名内部クラスにもコンストラクターがあり、通常のクラスのコンストラクターとは少し異なります。コンパイル時に、匿名内部クラスのコンストラクターのパラメーター リストの前に別のパラメーターが挿入されます。このパラメーターはオブジェクトへの参照です。外部クラスのコンパイル クラスは次のようになります:

    リーリー

    new Action(){...}実際には、Test$1が作成され、コンストラクターを通じてテストオブジェクト参照がTest$1に渡されます

    リーリー

    したがって、匿名の内部クラスは外部クラスへの参照を保持し、外部クラスのメソッドを呼び出すことができます

    返事
    0
  • キャンセル返事