java为什么不在WindowAdapter中实现某些方法?
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
的情况下,我如何能够只实现一个抽象方法?这是一个单一的情况,如果不是,我可以模仿这种行为吗
# 1 楼答案
如果您试图实现WindowListener,那么应该为所有方法提供实现。这里的窗口适配器只是一个抽象类,它为窗口事件提供部分实现。因此,您可以为特定事件(例如windowclose)提供实现
# 2 楼答案
尽管WindowAdapter是一个抽象类,但它的方法不是抽象的,而是空的。因此,您不必实现它们,但如果需要,可以覆盖它们
https://docs.oracle.com/javase/7/docs/api/java/awt/event/WindowAdapter.html
关于新关键字:这被称为匿名类。基本上,创建一个没有名称的新类,同时实例化它。因此,新类没有名称,它扩展了WindowAdapter,重写了一个方法,并且只能在这个位置实例化(因为它没有名称)