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