Как работает actionListener, использующий анонимные объекты? - PullRequest
1 голос
/ 02 декабря 2011

Я сейчас немного растерялся. У меня есть кнопка, давайте назовем это b1

теперь я хочу добавить actionListener, чтобы с помощью анонимных объектов я сделал бы это

      b1.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                             ...
                 }
           });

Я не могу понять, что представляет собой объект ActionListener. Разве ActionListener не является интерфейсом? Итак, мы создаем объект интерфейса? как это возможно и почему мы это делаем?

когда я пытаюсь этот код

  ActionListener al = new ActionListener();

это дает мне сообщение об ошибке

  Cannot instantiate the type ActionListener

если я использую

   ActionListener al;

это правильно, но что я могу сделать с al?

заранее спасибо

Ответы [ 3 ]

4 голосов
/ 02 декабря 2011

Этот синтаксис:

new ActionListener() { ... }

определяет анонимный класс, который реализует интерфейс ActionListener.Вы не создаете экземпляр ActionListener;вы создаете экземпляр этого анонимного класса.(Компилятор фактически присваивает ему имя - обычно что-то вроде MyEnclosingClass$1. Для этого анонимного класса будет отдельный файл .class.) Подробнее об анонимных внутренних классах можно прочитать в руководстве по Java .

Вы можете использовать этот новый объект непосредственно в вызове функции (как в первом фрагменте кода) или назначить его переменной, тип которой совместим с присваиванием ActionListener.

ActionListener al = new ActionListener() { ... };
1 голос
/ 02 декабря 2011

Обратите внимание, что ActionListener является интерфейсом. Интерфейсы предназначены для реализации классами. Вы не можете создать интерфейсы. Так что это не удастся:

ActionListener al = new ActionListener ();

На языке ОО вы заходите в магазин фруктов и просите "Фрукты". Нет ничего похожего на фрукт! Апельсин реализует фрукты. Экземпляр апельсина доступен в корзине. Владелец магазина может выбрать тот «экземпляр» апельсина и передать его вам, который является реальным объектом.

Точно так же вы не можете пойти и попросить машину. Вы можете приобрести автомобиль только у определенного производителя данной марки. Здесь бренд будет интерфейс.

Теперь посмотрим на это:

ActionListener al;

Это эквивалентно утверждению, что Апельсин - это Фрукт, а это фактическое утверждение.

Предположим, у вас есть BMW Lexus с регистрационным номером AXYZ 67112. Ваш объект - это ваш автомобиль, который расширяет BMWCars и реализует интерфейс Lexus. Фактически предъявляются следующие претензии:

Car myBMWCar; Lexus myBMWCar;

Вам нужно будет освежить свои концепции ОО!

0 голосов
/ 02 декабря 2011

В наших программах мы сталкиваемся с ситуациями, когда нам нужно использовать какую-либо переменную или что-то только один раз, тогда мы не дадим ей правильное имя, потому что мы будем использовать это только один раз. Анонимные классы работают так же.

Точно так же анонимные классы - это классы без имен, и мы будем использовать их в нашем коде только один раз, поэтому мы не даем им имя.

Это хороший пример анонимных классов. Like Этот объект будет использоваться только в том случае, если для этой кнопки будет выполнено действие.

new ActionListener(){
     //code
}

Это синтаксис создания анонимного класса.

new предназначен для создания объекта класса (класса без имени), а затем ActionListener означает, что этот класс реализует этот интерфейс. Итак, теперь вы получаете простой объект класса, который не имеет имени, но дает вам возможность переопределять методы интерфейса ActionListener.

...