21

インターフェイスを実装している内部クラスのコンストラクターを作成するにはどうすればよいですか?私はまったく新しいクラスを作ることができることを知っていますが、これに沿って何かをする方法がなければならないと思います:

JButton b = new JButton(new AbstractAction() {

    public AbstractAction() {
        super("This is a button");                        
    }


    public void actionPerformed(ActionEvent e) {
        System.out.println("button clicked");
    }
}); 

これを入力すると、AbstractActionメソッドがコンストラクターとして認識されません(コンパイラーは戻り型を要求します)。誰かアイデアがありますか?

4

4 に答える 4

35

拡張クラスの名前の後にパラメータを挿入するだけです。

JButton b = new JButton(new AbstractAction("This is a button") {

    public void actionPerformed(ActionEvent e) {
        System.out.println("button clicked");
    }
}); 

また、初期化ブロックを使用できます。

JButton b = new JButton(new AbstractAction() {

    {
       // Write initialization code here (as if it is inside a no-arg constructor)
       setLabel("This is a button")
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println("button clicked");
    }
}); 
于 2010-06-15T12:43:28.503 に答える
9

何らかの理由で実際にコンストラクターが必要な場合は、初期化ブロックを使用できます。

JButton b = new JButton(new AbstractAction() {

    {
        // Do whatever initialisation you want here.
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println("button clicked");
    }
}); 

ただし、そこからスーパークラスのコンストラクターを呼び出すことはできません。Itayが言ったように、newへの呼び出しに必要な引数を渡すことができます。

個人的には、このための新しい内部クラスを作成します。

private class MyAction extends AbstractAction {

    public MyAction() {
        super("This is a button.");
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println("button clicked");
    }
}

それから:

JButton b = new JButton(new MyAction());
于 2010-06-15T12:48:58.007 に答える
4

結果のクラスは型ではなく、AbstractAction拡張/実装するいくつかの(名前のない、匿名の)型ですAbstractAction。したがって、この匿名クラスのコンストラクターには、この「不明な」名前が必要ですが、は必要ありませんAbstractAction

これは通常の拡張/実装のようなものです。aを定義してclass House extends Buildingコンストラクターを作成するHouse場合は、コンストラクターに名前を付けますが、元の質問に戻ることはHouseできません。BuildingAbstractAction

于 2010-06-15T12:48:00.440 に答える
1

コンパイラが文句を言う理由は、匿名クラス内でコンストラクタを宣言しようとしているためです。これは、匿名クラスが持つことを許可されていません。他の人が言っているように、インスタンス初期化子を使用するか、匿名でないクラスに変換することでこれを解決できるため、コンストラクターを作成できます。

于 2015-11-30T11:22:48.487 に答える