Может кто-нибудь объяснить мне этот синтаксис Java? - PullRequest
0 голосов
/ 27 февраля 2011

Может кто-нибудь объяснить мне этот синтаксис Java? Что эти скобки делают во внешних скобках?

addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent e) {
            System.exit(0);
        }
    });

Ответы [ 4 ]

6 голосов
/ 27 февраля 2011

Это называется анонимный внутренний класс . Он создает безымянный класс, который расширяет WindowAdapter (также можно было бы указать интерфейс, в этом случае класс реализует этот интерфейс), и создает один экземпляр этого класса. Внутри скобок вы должны реализовать все абстрактные методы или все методы интерфейса, а также можете переопределять методы.

2 голосов
/ 27 февраля 2011

И чтобы дополнить ответ andersoj, вы обычно используете их, когда метод ожидает экземпляр X, но X является абстрактным классом или интерфейсом.

Здесь вы фактически создаете производный класс от WindowAdapterи переопределение одного из методов для выполнения конкретной задачи.

Этот синтаксис очень распространен для обработчиков / слушателей событий.

2 голосов
/ 27 февраля 2011

Это анонимный внутренний класс - квадратные скобки обозначают начало и конец объявления класса. Это потенциально полезный вопрос SO и куча других .

1 голос
/ 13 февраля 2013

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

class CloseApplicationWindowAdapter extends WindowAdapter {
    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }
}

Тогда внутри вашего кода вы сделаете:

CloseApplicationWindowAdapter adapter =  new CloseApplicationWindowAdapter();
addWindowListener(adapter);

Оба решения имеют абсолютно одинаковый эффект (хотя, например, анонимный класс может создать файл Class$1.class). Java-программисты часто предпочитают подход анонимного класса, если анонимный класс не становится слишком большим / сложным / важным.

...