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