有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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的情况下,我如何能够只实现一个抽象方法?这是一个单一的情况,如果不是,我可以模仿这种行为吗


共 (2) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

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

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