为什么WindowAdapter中不允许实现某些方法?

时间:2015-05-29 17:05:02

标签: java

Java的WindowAdapter类被定义为抽象类,并且有许多抽象方法,包括:

windowClosing()
windowClosed()
windowActivated()

所有这些方法都是空的,Java表示该类存在是为了方便那些不想创建实现WindowListener的类的人。因为与WindowListener接口不同,WindowAdapter使我们可以选择只实现其中定义的一种抽象方法。

例如,如果我将以下代码添加到继承自Window的类中,我会通过' x'使窗口可关闭。右上角的按钮:

addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                dispose();
            }
        });

然而这让我感到困惑。首先,究竟发生了什么?我是否在创建一个扩展WindowAdapter的内部类? new关键字通常用于创建实例,但显然我不允许实例化抽象类。那么为什么new关键字在这里?

其次,为什么我只能在WindowAdapter中实现一种抽象方法? 通常在Java中,如果我定义一个抽象类:

public abstract class UpperClassAb {
    public abstract void test();

    public abstract int boa();

}

然后尝试使用此类,就像我使用上面的WindowAdapter

UpperClassAb tester = new UpperClassAb() {
            public void test() {
                System.out.println("mor");
            }
        };

我收到错误,因为我没有实现所有抽象方法,只有其中一个。在WindowAdapter的情况下,如何实现一种抽象方法?这是一个案例,如果没有,我可以模仿这种行为吗?

2 个答案:

答案 0 :(得分:2)

虽然WindowAdapter是一个抽象类,但它的方法不是抽象的,而是空的。因此,您不必实现它们,但如果需要,可以覆盖它们。

https://docs.oracle.com/javase/7/docs/api/java/awt/event/WindowAdapter.html

关于new关键字:这称为匿名类。您基本上创建一个没有名称的新类,并同时实例化它。所以新类没有名称,它扩展了WindowAdapter,覆盖了一个方法,并且只能在这个位置实例化(因为它没有名字)

答案 1 :(得分:0)

如果您正在尝试实现WindowListener,则应为所有方法提供实现。这里窗口适配器只是抽象类,它为窗口事件提供部分实现。因此,您可以提供特定事件的实现(例如windowclose)