在Java中,当我在对象初始化期间覆盖方法时它会调用什么?

时间:2013-08-09 13:48:06

标签: java

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

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

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

另外,关于加分的后续问题:-)为什么会存在这个问题?在我看来,这将导致一些相当混乱的代码。为什么不延长ActionListener

更新

原谅我,我想问你为什么不实施 ActionListener

5 个答案:

答案 0 :(得分:5)

它被称为匿名分类接口。

基本上,您正在使用ActionListener的接口并创建一个仅由封装它的类所知的实例。

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

接口更易于定制,更像是模板,不能是独立的类。通常,将接口设置为独立类是没有任何意义的。

答案 1 :(得分:2)

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

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

  • 我可以给这个名字命名
  • 我想在其他地方重复使用

匿名内部类不需要其他文件。你有代码,就在需要它的地方,但是阻碍了代码重用。

答案 2 :(得分:0)

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

Sarajog

答案 3 :(得分:0)

这一点的重点是避免定义一个全新的“真实”类,占用一个完整的文件(是的,大不了,我知道),因为其他目的非常微不足道。即它与你正在做的事情相结合,你想要这种低注意力的机制。

答案 4 :(得分:0)

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

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