7

我正在寻找可用于谷歌的条款。我只是不确定如何描述这种语法:

JButton myButton = new JButton("Press Me");
myButton.addActionListener(new ActionListener() 
{
    @Override
    public void actionPerformed(ActionEvent e) 
    {
        System.out.println("MyButton was pressed.");
    }
});

这种语法对我来说是新的。这种模式/技术有名称吗?它是什么?

此外,还有一个额外的问题:-) 为什么会这样?在我看来,这会导致一些非常混乱的代码。为什么不只是扩展ActionListener

更新

原谅我,我的意思是问你为什么不实施 ActionListener.

4

5 回答 5

6

它被称为匿名分类接口。

本质上,您正在使用 ActionListener 的接口并创建一个只有封装它的类才知道的实例。

您不能扩展 ActionListener 因为它是一个接口。扩展一个类意味着从它继承,而您不能从 Java 中的接口继承。

接口更可定制,更像模板,不能是独立的类。通常,让接口成为独立类是没有意义的。

于 2013-08-09T13:53:01.460 回答
2

正如 Rohit Jain 所说:它是一个匿名的内部类。

是的,您可以ActionListener在另一个文件的普通类中实现接口。我宁愿在以下情况下这样做:

  • 我可以给这东西起个名字
  • 我想在其他地方重复使用它

匿名内部类不需要另一个文件。你有代码,就在需要的地方,但会阻碍代码重用。

于 2013-08-09T13:54:12.970 回答
0

这称为匿名内部类。事实上,您正在实现 ActionListener 并同时实例化这个新的匿名类 - 类型名称将由编译器生成。在您只需要一次课程的情况下,您会这样做。

请参阅http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

于 2013-08-09T13:55:50.223 回答
0

就像其他人已经说过的那样,它被称为匿名内部类。这是一个示例/说明:http ://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

萨拉约格

于 2013-08-09T13:54:11.167 回答
0

这样做的目的是避免定义一个全新的“真实”类,占用整个文件(是的,很重要,我知道),用于其他用途如此微不足道且无用的东西。即它与你正在做的事情如此耦合,你想要这种低注意力机制。

于 2013-08-09T13:54:18.800 回答