2

簡単なケースを次に示します。

    private final MouseAdapter mouse = new MouseAdapter() {
        public void mouseClicked(MouseEvent e) {
            calculate();
        }
    };

これはクラス レベルのフィールドなので、匿名クラスと呼ぶのは適切ではないようです。ネストされたクラスに関する Oracle チュートリアルのページにある他の名前や説明はどれも当てはまらないようです。

「単一使用オブジェクト」に沿ったものだと思いますが、「匿名クラスという名前のクラスレベル」のようなことを言わずに説明することさえ困難です


Java と AWT に慣れていない人のために説明すると、マウス操作をリッスンするためのインターフェースを実装する操作のないメソッドを持つクラスのインスタンスを作成しています。複数のタイプのリスナー (ホイール、モーション、クリック) として追加できるように、実際のインスタンスが必要ですが、制御には同じオブジェクトを使用します。ただし、質問自体はAWT固有ではありません。

4

3 に答える 3

4

小分けにしましょう

  • private final MouseAdapter mouseクラス メンバと呼ばれ、 type( MouseAdapter) は、メンバが のインスタンスおよび/またはサブクラスを参照できることを示しますMouseAdapter

  • new MouseAdapter() { ... }インターフェイス/抽象クラスの匿名実装と呼ばれます。MouseAdapter

要約すると、クラス メンバーはインターフェイス/抽象クラスmouseの匿名実装への参照を保持します。MouseAdapter

于 2014-10-17T06:54:49.087 に答える
2

これは匿名クラスのインスタンスであり、新しい名前を見つける必要はありません。

オラクルのドキュメントから:

匿名クラスを使用すると、コードをより簡潔にすることができます。クラスの宣言とインスタンス化を同時に行うことができます。名前がないことを除けば、ローカル クラスに似ています。ローカル クラスを 1 回だけ使用する必要がある場合に使用します。

インスタンスが一度だけ使用されるとは言いませんが、クラスのみが使用されるため、ケースと矛盾することはありません。

于 2014-10-17T06:56:29.350 に答える
1

答えに同意しkocko'sますが、1つ追加したいのは、

匿名クラスは式です。つまり、クラスを別の式で定義します。

したがって、どこで宣言しても、匿名クラスのままであり、宣言に別の名前を付ける必要はありません。:)

于 2014-10-17T06:57:19.210 に答える