Определение Java - встроенного класса

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

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

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

Ответ 1

Это анонимный внутренний класс. Вы можете найти дополнительную информацию об этом на ссылку документации Java для Внутренние классы. EDIT Я добавляю лучшую ссылку, описывающую анонимные внутренние классы, поскольку документация по 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

Что происходит в вашем коде, так это то, что вы неявно подклассифицируете Apple с анонимным внутренним классом и переопределяете его метод toString().

Ответ 3

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