此代码是否在不创建新类的情况下实例化或扩展抽象类?

2022-09-02 21:01:35

我对编程相当陌生,但我在学校上了Intro CS课程,所以我了解了大部分基础知识(或者认为我做到了)。我试图通过JOGL自学一些OpenGL,我遇到了几行我无法理解的代码。我错过了什么吗?

frame.addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
    System.exit(0);
  }
});
  • 我检查了Javadoc,它是一个抽象类。那么他怎么能实例化它呢?WindowAdapter

  • 或者这甚至是创建一个实例?

  • 看起来代码几乎扩展或重写了该方法,但是如果不编写新类,这怎么可能呢?WindowAdapterwindowClosing


答案 1

它几乎看起来像代码扩展或覆盖了该方法WindowAdapterwindowClosing

这正是正在发生的事情。

但是如果不写一个新的类,这怎么可能呢?

实际上,代码正在创建一个新的(匿名)类。只是语法与你到目前为止遇到的语法不同。请看教程

有关如何使用匿名类的讨论,请参阅如何在 Java 中使用匿名(内部)类?


答案 2

使用的概念是匿名类!....由于 WindowAdapter 是一个抽象类,因此您无法将其作为对象,但使用匿名类概念,您可以调用其构造函数或使用函数,而无需将其分配给其类型的对象。

使用抽象类数据变量和方法的另一种方法是制作其派生类的对象

通过这种方式,您可以在参数中传递一个 WindowAdpater 实例,而不会出现任何错误。


推荐