2015-05-29 3 views
-1

WindowAdapter класс Java определяется как абстрактного класса и имеет много абстрактных методов, в том числе:Почему не реализованы некоторые методы в WindowAdapter?

windowClosing() 
windowClosed() 
windowActivated() 

Все эти методы являются пустыми и Java говорит, что класс существует как удобство для тех, кто не хочет создавать классы, реализующие WindowListener. Поскольку в отличие от интерфейса WindowListener, WindowAdapter дает нам возможность реализовать только один из абстрактных методов, определенных в нем.

Например, если добавить следующий код в класс, который наследует от Window, я сделать окно закрывающиеся с помощью кнопки «х» в правом верхнем углу:

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

Хотя WindowAdapter является абстрактным классом, его методы не абстрактны, но пусты. Таким образом, вам не нужно их реализовывать, но вы можете переопределить их, если хотите.

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

Относительно нового ключевого слова: это называется анонимный класс. Вы в основном создаете новый класс без имени и одновременно создаете его. Таким образом, новый класс не имеет имени, он расширяет WindowAdapter, переопределяет один метод и может ТОЛЬКО быть создан в этом месте (поскольку он не имеет имени)

+0

Спасибо, что объясняет второй вопрос, как насчет первого, почему мы используем новое ключевое слово при определении внутреннего класса? – Gravity

+0

я отредактировал мой ответ, чтобы включить объяснение для нового ключевого слова – loonytune

+0

в порядке, через 7 минут ваш ответ будет принят :) – Gravity

0

Если вы пытаетесь реализовать WindowListener, вы должны предоставить реализацию для все методы. Здесь оконный адаптер - не что иное, как абстрактный класс, который предоставляет частичные реализации событий окна. Из-за этого вы можете обеспечить реализацию для конкретного события (например, windowclose)

Смежные вопросы