Является ли этот код экземпляром или расширением абстрактного класса без создания нового класса?

Я новичок в программировании, но я взял класс Intro CS в своей школе, поэтому я понимаю большинство основ (или думал, что сделал). Я пытаюсь научить себя OpenGL через JOGL, и я натолкнулся на несколько строк кода, которые я не мог понять. Я что-то пропустил?

frame.addWindowListener(new WindowAdapter() {
  public void windowClosing(WindowEvent e) {
    System.exit(0);
  }
});
  • Я проверил Javadoc, а WindowAdapter - абстрактный класс. Итак, как он может создать его?

  • Или это даже создает экземпляр?

  • Это почти похоже на то, что код расширяет WindowAdapter или переопределяет метод windowClosing, но как это возможно без написания нового класса?

Ответы

Ответ 1

Это почти похоже на то, что код расширяет WindowAdapter или переопределяет метод windowClosing

Это именно то, что происходит.

но как это возможно без написания нового класса?

Фактически, код создает новый (анонимный) класс. Это просто, что синтаксис отличается от того, с которым вы столкнулись до сих пор. Взгляните на tutorial.

Для обсуждения того, как используются анонимные классы, см. Как анонимные (внутренние) классы используются в Java?

Ответ 2

Используемая концепция - это класс Anonymous!.... Поскольку WindowAdapter является абстрактным классом, вы не можете сделать его объектом, но с использованием концепции анонимного класса вы можете вызвать его конструктор или использовать функции, не присваивая его объекту этого типа.

Другим способом использования переменных и методов данных Abstract classes является создание объектов его производных классов

Таким образом, u может иметь экземпляр WindowAdpater, переданный в параметр без каких-либо ошибок.