#java #ооп #интерфейс
This question already has an answer here:
Использование анонимного класса
(1 ответ)
Закрыт 4 года назад.
Вот очень простой код:
item.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
});
Вроде бы все легко. А я его не совсем понимаю. Даже немного стыдно из-за этого.
В частности, не понимаю вот это выражение new ActionListener(). Здесь ведь есть и
операция new и круглые скобки.. Как будто бы мы создаем объект. Но ведь нельзя создать
объект интерфейса. Да и потом понятно что здесь создается анонимный класс, а не объект.
Объясните пожалуйста, почему такой странный синтаксис и что же на самом деле тут
происходит?
UPD: Написали что этот вопрос может являться дубликат:
Использование анонимного класса
Но там разбирается что в принципе происходит в строе new ActionListener(){}
А я понимал, что там создается объект анонимного класса, мне было интересно почему
для этого используется имя интерфейса.
Ответы
Ответ 1
Когда ты создаешь новый объект, ты пишешь так: new Foo(); Точка с запятой в конце важна, ты вызываешь непосредственно конструктор класса Foo. В случае с анонимным классом ты делаешь так: new ActionListener() { // Тело нового класса } Обрати внимание на фигурные скобки. Это разница в синтаксисе. Теперь по смыслу: фактически ты создаешь наследника класса и одновременно вызываешь его конструктор без параметров, дополнительно в теле реализуя необходимые тебе методы. То есть такой себе одноразовый класс-наследник. Ты мог бы сделать так в отдельном файле: class MyActionListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } } А затем: item.addActionListener(new MyActionListener()); по смыслу было бы аналогично, но в дальнейшем ты сможешь ещё создавать объекты MyActionListener, в то время как при использовании анонимного класса ты его описал, создал объект и забыл о его описании.
Комментариев нет:
Отправить комментарий