Если видео недоступно для просмотра, попробуйте выключить блокировщик рекламы.
Для сохранения прогресса вступите в курс. Войти или зарегистрироваться.

Анонимные классы объявляются без указания в коде имени класса.

Анонимные классы могут быть созданы:

1) как реализация интерфейса

public class Foo {
    // Анонимный класс, который реализует интерфейс SayHello
    static SayHello h = new SayHello() {
        @Override
        public void say() {
            System.out.println("Метод внутреннего анонимного класса");
        }
    };

    public static void main(String[] args) {
        h.say();
    }
}
// somewhere 
interface SayHello {
    void say();
}

2) как наследник определённого класса

public class External {
    // Анонимный класс наследуется от класса Foo
    static Foo foo = new Foo() {
        @Override
        public void show() {
            super.show();
            System.out.println("Метод внутреннего анонимного класса");
        }
    };
    public static void main(String[] args) {
        foo.show();
    }
}

class Foo {
    public void show() {
        System.out.println("Метод суперкласса");
    }
}

Анонимный класс может быть как статическим, так и нестатическим. Это напрямую зависит от того, статическим или нестатическим является блок, в котором анонимный класс был объявлен.

Если анонимный класс объявлен в статическом блоке:

public class Anonymous {
    public static void main(String[] args) {

        Runnable anonym = new Runnable() {
            @Override
            public void run() {
            }
        };
    }
}

То его второй экземпляр можно создать так: Runnable anonym2 = (Runnable) anonym .getClass().newInstance().run().

Если же анонимный класс был объявлен внутри нестатического блока, то для создания второго экземпляра анонимного класса нужно передать в его конструктор ссылку на обрамляющий класс. В противном случае получим InstantiationException. Более детально в этой статье.

Любой анонимный внутренний класс может за один раз реализовать только один интерфейс. Так же, за один раз можно либо расширить класс, либо реализовать интерфейс, но не одновременно.

Анонимные классы полезны в некоторых "узких" участках кода, когда нет необходимости их потом переиспользовать где-то еще. Чаще всего на практике используют лишь один экземпляр анонимного класса. Если же реализацию интерфейса придется использовать много раз в коде -- то лучше использовать лямбда-выражения, которые стали доступны начиная с JAVA 8.

Группы для общения:

Мы учим программированию с нуля до стажировки и работы. Попробуйте наш бесплатный курс «Введение в программирование» или полные программы обучения по Node, PHP, Python и Java.

Хекслет

Подробнее о том, почему наше обучение работает →