Страницы

Поиск по вопросам

пятница, 14 декабря 2018 г.

Проблема с анонимными классами: как понимать создание объекта интерфейса? [дубликат]

На данный вопрос уже ответили: Использование анонимного класса 1 ответ Вот очень простой код:
item.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub
}
});
Вроде бы все легко. А я его не совсем понимаю. Даже немного стыдно из-за этого. В частности, не понимаю вот это выражение new ActionListener(). Здесь ведь есть и операция new и круглые скобки.. Как будто бы мы создаем объект. Но ведь нельзя создать объект интерфейса. Да и потом понятно что здесь создается анонимный класс, а не объект. Объясните пожалуйста, почему такой странный синтаксис и что же на самом деле тут происходит?
UPD: Написали что этот вопрос может являться дубликат: Использование анонимного класса Но там разбирается что в принципе происходит в строе new ActionListener(){} А я понимал, что там создается объект анонимного класса, мне было интересно почему для этого используется имя интерфейса.


Ответ

Когда ты создаешь новый объект, ты пишешь так:
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, в то время как при использовании анонимного класса ты его описал, создал объект и забыл о его описании.

Комментариев нет:

Отправить комментарий