1

内部クラスに関する記事を読んでいます。匿名の内部クラス (後述) を示す例を見つけました。

  button1 = new JButton();
  button2 = new JButton();
  ...
  button1.addActionListener(
     new java.awt.event.ActionListener()
     {
        public void actionPerformed(java.awt.event.ActionEvent e)
        {
           // do something
        }
     }
  );

例によると、ActionListener インターフェイスを使用してボタンに応答するための内部クラスを作成します。私が知っているように、インターフェースにはコンストラクターがありません。しかし、彼らがコンストラクターをどのように呼び出すのか疑問に思っています。

"新しい java.awt.event.ActionListener(){ }"

4

8 に答える 8

2

インターフェイスにはコンストラクターがありませんが、匿名クラスにはコンストラクターがあります。すべてのクラスと同様に、java.lang.Object暗黙的に拡張されるため、Objectのパラメーターなしのコンストラクターを呼び出すことができます。

さらに、Object匿名クラスはカスタム コンストラクターを定義できないため、 のコンストラクターは呼び出すことができる唯一のコンストラクターです。

もちろん、java.lang.Object匿名クラスの実装を拡張することに加えて、それをメソッドActionListenerに渡すことができるのはそのためです。addActionListener

于 2013-08-22T04:02:28.473 に答える
0

匿名内部クラス: 名前のない内部クラス。

ここで私たちが気にする唯一の詳細は、この新しいクラスがインターフェースをサブタイプ化する必要があり、そのために必要なメソッド実装を提供することです。

このクラスのコンストラクターはデフォルトのコンストラクターであり、インスタンス変数が関連付けられていないため、ジョブを適切に実行します。

于 2013-08-22T04:04:54.247 に答える
0

サブクラスを構築しています。

于 2013-08-22T04:01:46.030 に答える
0

インターフェイスをインスタンス化していません。そのインターフェイスを実装する匿名クラスを作成し、すぐにこのクラスのインスタンスを作成するようにコンパイラに要求しています。

これを実証する最善の方法は、"class" ディレクトリに移動することです。className$1.class、などの形式のファイルが見つかりますclassName$2.class。これらのファイルは、それらの無名クラスに対応しています。インターフェイス自体をインスタンス化する場合、これらの新しいクラス ファイルは必要ありません (もちろん、それらに含まれる匿名クラスも必要ありません)。

于 2013-08-22T04:16:30.507 に答える
0

Java 仕様、特にDefault Constructorセクションをざっと見てください。インターフェイスのインスタンスをインスタンス化するとオブジェクトになるため、コンストラクターを取得します。

仕様から引用:

クラスにコンストラクタ宣言が含まれていない場合、仮パラメータも throws 節もないデフォルト コンストラクタが暗黙的に宣言されます。

于 2013-08-22T04:02:40.173 に答える
0

それが匿名クラスのやり方です(構文的に)。

ドキュメントによると

匿名クラス式は、次のもので構成されます。

  1. 新しいオペレーター
  2. 実装するインターフェースまたは拡張するクラスの名前。
  3. 通常のクラス インスタンス作成式と同様に、コンストラクタへの引数を含む括弧。注: インターフェイスを実装する場合、コンストラクターがないため、空の括弧のペアを使用します。
  4. クラス宣言本体である本体。より具体的には、本文では、メソッド宣言は許可されていますが、ステートメントは許可されていません。
于 2013-08-22T04:18:17.593 に答える