Java - определение встроенного класса - PullRequest
10 голосов
/ 18 января 2012

Я видел пару примеров, подобных этому на Java, и я надеюсь, что кто-то может объяснить, что происходит.Кажется, что новый класс может быть определен inline, что мне кажется странным.Ожидается первая строка распечатки, так как это просто toString.Однако, 2-й кажется, что функция может быть переопределена встроенным.Есть ли технический термин для этого?Или какая-либо документация, которая углубляется?Спасибо!

Если у меня есть следующий код:

public class Apple {
    public String toString() {
        return "original apple";
    }
}

public class Driver {
    public static void main(String[] args) {
        System.out.println("first: " + new Apple());
        System.out.println("second: " + 
            new Apple() {
                public String toString() {
                    return "modified apple";
                }
            }
        );
    }
}

Код выводит:

first: original apple
second: modified apple

Ответы [ 3 ]

15 голосов
/ 18 января 2012

Это анонимный внутренний класс. Вы можете найти больше информации об этом по ссылке документации Java для Inner Classes . РЕДАКТИРОВАТЬ Я добавляю лучшую ссылку , описывающую анонимные внутренние классы, поскольку документация Java оставляет желать лучшего. / EDIT

Большинство людей используют анонимные внутренние классы для определения слушателей на лету. Рассмотрим этот сценарий:

У меня есть Button, и когда я нажимаю на него, я хочу, чтобы он отображал что-то на консоли. Но я не хочу создавать новый класс в другом файле, и я не хочу определять внутренний класс позже в этом файле, я хочу, чтобы логика была немедленно доступна прямо здесь.

class Example {
    Button button = new SomeButton();

    public void example() {
        button.setOnClickListener(new OnClickListener() {
            public void onClick(SomeClickEvent clickEvent) {
                System.out.println("A click happened at " + clickEvent.getClickTime());
            }
        });
    }

    interface OnClickListener {
        void onClick(SomeClickEvent clickEvent);
    }

    interface Button {
        void setOnClickListener(OnClickListener ocl);
    }
}

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

2 голосов
/ 18 января 2012

В вашем коде происходит то, что вы неявно создаете подкласс Apple с помощью анонимного внутреннего класса и переопределяете его метод toString().

0 голосов
/ 18 января 2012

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

...