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

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

JButton b = new JButton(new AbstractAction() { public AbstractAction() { super("This is a button"); } public void actionPerformed(ActionEvent e) { System.out.println("button clicked"); } }); 

当我输入它时,它不会将AbstractAction方法识别为构造函数(编译器要求返回类型)。 有没有人有想法?

只需在扩展类的名称后插入参数:

 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"); } }); 

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

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

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

这就像正常的扩展/实现一样:如果你定义一个class House extends Building并构建一个House你可以命名构造函数House而不是Building (或者说AbstractAction只是为了回到原始问题)。

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