Что делает та конструкция Java?

Я в новинку для Java так терплю меня, если это - смехотворно простой вопрос, но мне любопытно на предмет этого вызова метода, который имеет {кодируют} быть принятым - см. код ниже для примера в методе addSelectionListener. Какова цель этого? Я просматривал документы для explaination, но наклон, кажется, находит то, чем называют эту практику, не берут в голову любую полезную информацию.

    setStatusLine.addSelectionListener(new SelectionAdapter() {
        public void widgetSelected(SelectionEvent e) {

            String message = "I would like to say hello to you.";
            if (pressed) {
                message = "Thank you for using me";
            }
            setStatusLine(message);
            pressed = !pressed;
        }
    });

Спасибо за любую справку или понимание, которое может быть предложено

8
задан TM. 21 April 2010 в 12:46
поделиться

5 ответов

это анонимный класс или анонимный внутренний класс. Если вы поищете это в Google, вы найдете несколько руководств / примеров. Sun также имеет некоторые документы .

7
ответ дан 5 December 2019 в 10:40
поделиться

На самом деле нет вызова метода ... Этот код устанавливает прослушиватель выбора для компонента setStatusLine.

Эквивалент этого кода может быть

public class X implements SelectionListener{

    //In the constructor or an other method.
    setStatusLine.addSelectionListener(this);

    public void widgetSelected(SelectionEvent e) {

        String message = "I would like to say hello to you.";
        if (pressed) {
            message = "Thank you for using me";
        }
        setStatusLine(message);
        pressed = !pressed;
    }

}
2
ответ дан 5 December 2019 в 10:40
поделиться

Метод addSelectionListener получает экземпляр SelectionListener. Он не получает «код». Непонятным является использование new () {...}. Эта конструкция используется для анонимных внутренних классов . Фактически, приведенный выше код расширяет класс SelectionAdapter, переопределяет его метод widgetSelected, создает экземпляр нового класса и передает его в addSelectionListener ().

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

3
ответ дан 5 December 2019 в 10:40
поделиться

Мне потребовалось некоторое время, чтобы понять анонимные внутренние классы. Основные вещи, которые следует запомнить:

Они похожи на параметры, за исключением того, что вместо передачи примитива или объекта вы передаете класс, который реализует интерфейс / расширяет класс (да, они также работают с интерфейсами) в зависимости от параметра метода . Они анонимны, поэтому "исчезают" сразу после того, как метод выскочил из стека. }); - бесполезный подарок для анонимного внутреннего класса. Они часто всплывают в пользовательских интерфейсах для событий слушателя Они сохраняют беспорядок в вашем коде, но также затрудняют его чтение.

Для полного наказания прочтите JLS: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9.5

Если вам интересно знать Если говорить о таких вещах, читать книгу SCJP и сдавать экзамен - это хорошо, или вы можете изучить JLS.Он не научит вас программировать, но поможет понять, как работают Java и, в некотором роде, многие другие объектно-ориентированные языки.

0
ответ дан 5 December 2019 в 10:40
поделиться

Как уже сказали другие участники: Это анонимный класс

Вы могли бы создать новый класс с именем MyClass в новом файле с именем McClass.java выглядит так:

class MyClass extends SelectionAdapter {

  public void widgetSelected(SelectionEvent e) {
    <your code that's being executed whenever the widget is being selected>
  }

}

Тогда вы могли бы изменить первую строку вот так:

setStatusLine.addSelectionListener (new MyClass ());

Видите? Теперь у вас есть «явный» класс всего с одной функцией. Часто это слишком накладные расходы и загромождают ваш дизайн.

Это поможет?

4
ответ дан 5 December 2019 в 10:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: