0

有人可以向我解释这个 Java 语法吗?外括号内的那些括号在做什么?

addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });
4

4 回答 4

6

它被称为匿名内部类。它创建一个未命名的扩展类WindowAdapter(也可以指定一个接口,在这种情况下,该类将实现该接口),并创建该类的一个实例。在括号内,您必须实现所有抽象方法或所有接口方法,并且您也可以覆盖方法。

于 2011-02-27T05:57:02.887 回答
2

这是一个匿名内部类——括号表示类声明的开始和结束。这是一个潜在有用的 SO 问题,还有很多其他问题。

于 2011-02-27T05:55:23.780 回答
2

为了补充安德索的答案,您通常在方法需要 X 的实例时使用它们,但 X 是抽象类或接口。

在这里,您实际上是从 WindowAdapter 创建派生类,并重写其中一种方法来执行特定任务。

这种语法对于事件处理程序/侦听器非常常见。

于 2011-02-27T06:03:50.883 回答
1

它是一个匿名内部类。这只是一个捷径。如果您需要将其创建为顶级类,您可以想象代码会是什么样子:

class CloseApplicationWindowAdapter extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
}

然后,在您的代码中,您将执行以下操作:

CloseApplicationWindowAdapter adapter =  new CloseApplicationWindowAdapter();
addWindowListener(adapter);

两种解决方案具有完全相同的效果(例如,尽管匿名类会创建一个Class$1.class文件)。如果匿名类不会变得太大/复杂/重要,Java 程序员通常会更喜欢匿名类方法。

于 2013-02-13T18:25:37.827 回答