Страницы

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

понедельник, 30 декабря 2019 г.

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

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

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

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