8

私はJavaを初めて使用するので、これがばかばかしいほど単純な質問である場合は我慢してください。ただし、{code}が取り込まれるこのメソッド呼び出しに興味があります。メソッドaddSelectionListenerの例については、以下のコードを参照してください。これの目的は何ですか?私は説明のためにドキュメントを調べてきましたが、この慣習が何と呼ばれているのかを見つけることができないようです。有用な情報を気にしないでください。

    setStatusLine.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {

            String message = "I would like to say hello to you.";
            if (pressed) {
                message = "Thank you for using me";
            }
            setStatusLine(message);
            pressed = !pressed;
        }
    });

提供できるヘルプや洞察に感謝します

4

5 に答える 5

7

これは匿名クラス、または匿名内部クラスです。あなたがそれをグーグルで検索すると、いくつかのチュートリアル/例が見つかります。Sunにもいくつかのドキュメントがあります。

于 2010-04-21T09:13:42.007 に答える
4

他の寄稿者がすでに言ったように:それは匿名のクラスです

次のようなMcClass.javaという新しいファイルにMyClassという名前の新しいクラスを作成することもできます。

class MyClass extends SelectionAdapter {

  public void widgetSelected(SelectionEvent e) {
    <your code that's being executed whenever the widget is being selected>
  }

}

次に、次のように最初の行を変更できます。

setStatusLine.addSelectionListener(new MyClass());

見る?これで、関数が1つだけの「明示的な」クラスができました。多くの場合、これはオーバーヘッドが大きすぎて、デザインが乱雑になります。

それは役に立ちますか?

于 2010-04-21T09:25:14.403 に答える
3

メソッドaddSelectionListenerは、SelectionListenerインスタンスを受け取ります。「コード」を受け取りません。紛らわしいのは、新しい<class / interface name>(){...}の使用です。この構成は、匿名の内部クラスに使用されます。実際、上記のコードは、SelectionAdapterクラスを拡張し、そのwidgetSelectedメソッドをオーバーライドし、新しいクラスのインスタンスを作成して、それをaddSelectionListener()に渡します。

匿名の内部クラスの使用は、ある特定の場所で使用される新しいクラスを作成するリスナーで一般的です。したがって、名前を付けず、使用されているコンテキストで直接実装することをお勧めします。

于 2010-04-21T09:21:56.253 に答える
2

実際にはメソッド呼び出しはありません...このコードは、setStatusLineコンポーネントに選択リスナーを設定します。

このコードに相当するものは

public class X implements SelectionListener{

    //In the constructor or an other method.
    setStatusLine.addSelectionListener(this);

    public void widgetSelected(SelectionEvent e) {

        String message = "I would like to say hello to you.";
        if (pressed) {
            message = "Thank you for using me";
        }
        setStatusLine(message);
        pressed = !pressed;
    }

}
于 2010-04-21T09:18:05.137 に答える
0

AnonymousInnerクラスを理解するのに少し時間がかかりました。覚えておくべき基本的なことは次のとおりです。

これらはパラメータと同じですが、メソッドパラメータに応じて、インターフェイスを実装する/クラスを拡張する(はい、インターフェイスでも機能します)クラスで渡すプリミティブまたはオブジェクトを渡す代わりに。それらは匿名であるため、メソッドがスタックから外れた直後に「消える」。}); 匿名の内部クラスのための死んだプレゼントです。多くの場合、リスナーイベントのユーザーインターフェイスにポップアップ表示されます。コードが煩雑になることはありませんが、読みにくくなります。

完全な罰については、JLSをお読みください:http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9.5

そのようなことについての要点を知りたい場合は、SCJPの本を読んで試験を行うのが良いか、JLSを勉強することができます。コーディング方法は学習しませんが、Javaや他の多くのオブジェクト指向言語がどのように機能するかを理解するのに役立ちます。

于 2010-04-21T12:36:21.847 に答える