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

这就像正常的扩展/实现:如果你定义 aclass House extends Building并构造 aHouse你命名构造函数House而不是Building(或者AbstractAction只是回到原来的问题)。

于 2010-06-15T12:48:00.440 回答
1

编译器抱怨的原因是因为您试图在匿名类中声明一个构造函数,而匿名类不允许这样做。就像其他人所说的那样,您可以通过使用实例初始化程序或将其转换为非匿名类来解决此问题,因此您可以为其编写构造函数。

于 2015-11-30T11:22:48.487 回答