Если использование ключевого слова «new» в Java подразумевает распределение памяти, почему это не относится к анонимному внутреннему классу?

1

Как новичок в Java, мне научили, что использование "нового" ключевого слова приводит к вызову конструктора и, следовательно, распределению памяти для объекта. Если это действительно так, что происходит, когда мы пишем:

button.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e)
   {
      // do something.
   }
}); 

??

Если выделена память, не нарушает ли это понятие "Интерфейсы не могут быть созданы"? Нет ли выделения памяти для нового ActionListener? Если память не выделена, как ее получить, если мы не указываем ссылку на какой-либо объект? Или это просто действует как исключение из "распределения памяти в" новом "правиле?

Теги:
anonymous-inner-class

3 ответа

2
Лучший ответ

В вашем случае класс анонимного (имя, выбранный компилятором) создается с помощью конструктора по умолчанию и неявно реализованного интерфейса ActionListener и с радостью создается как любой другой класс, который вы создаете с new ключевым словом.

  • 0
    Часть, которая говорит «имя, выбранное компилятором», фактически отвечает на мой вопрос об отсутствии ссылки на объект. Спасибо :)
4

Новый ActionListener безусловно, выделяется. Вы определяете анонимный класс, который реализует необходимые методы в интерфейсе ActionListener, и поскольку вы определили конкретный класс, который реализует интерфейс, компилятор теперь может компилировать ваш анонимный класс и создавать его.

Вы могли бы так же легко сделать:

ActionListener al = new ActionListener() {
    public void actionPerformed(ActionEvent e) { ... }
};
button.addActionListener(al);

В приведенном выше примере становится очевиднее, что ActionListener был выделен, поскольку теперь он имеет область действия вне вызова метода и может упоминаться в следующем коде.

0

Скорее посмотрите на новое слово как на экземпляр объекта. Нет ли выделения памяти для нового ActionListener? Да. Если да, то как это делается? Объект кнопки вызовет ActionListener # actionPerformed(), передав только что появившееся событие action.

Здесь нет исключения из правила.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню