内部类中的构造函数(实现接口)

时间:2010-06-15 12:36:35

标签: java constructor inner-classes anonymous-inner-class

我如何为实现接口的内部类编写构造函数?我知道我可以创建一个全新的课程,但我认为必须有一种方法可以做到这一点:

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 个答案:

答案 0 :(得分: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");
    }
}); 

答案 1 :(得分:9)

如果你因任何原因确实需要一个构造函数,那么你可以使用一个初始化块:

JButton b = new JButton(new AbstractAction() {

    {
        // Do whatever initialisation you want here.
    }

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

但你不能从那里调用超类构造函数。正如Itay所说,你可以将你想要的参数传递给新的。

就个人而言,我会为此创建一个新的内部类:

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());

答案 2 :(得分:4)

结果类的类型不是AbstractAction,而是一些扩展/实现AbstractAction的(未命名的,匿名的)类型。因此,此匿名类的构造函数需要具有此“未知”名称,而不是AbstractAction

这就像普通的扩展/实现一样:如果您定义class House extends Building并构建House,则将构造函数命名为House而不是Building(或AbstractAction只是回到原来的问题)。

答案 3 :(得分:1)

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