Реализация интерфейса Java на примере Runnable

Столкнулся с такой реализацией интерфейса:

Runnable r = new Runnable {
    void run() {
      // что-то делает
    }
}

Я понимаю, что это многопоточность и интерфейс Runnable отвечает за многопоточность. Но вот такая реализация интерфейса - как класса мне не понятна. Я не могу сообразить, как такое загуглить. Поиск выдает стандартную реализацию через имплементс.

Такая реализация имеет свое название? Что это такое вообще?


Ответы (2 шт):

Автор решения: Byb

Это реализация интерфейса через анонимный класс. Современным вариантом (развитием анонимных классов) являются лямбда-выражения:

Runnable runnable = () -> {

};

Создавать анонимный класс можно не только от интерфейса, но и от абстрактного класса, а также от обычного.

Вообще, такая запись, через new, довольно забавная. Она выглядит почти как создание объекта (с той разницей, что появляются фигурные скобки), и это иногда путает новичков: кажется, будто происходит инстанцирование интерфейса / абстрактного класса, что невозможно.

Особенно когда не нужно переопределять принудительно какие-то методы, и получается что-то вроде:

AbstractClass example = new AbstractClass() {};

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

→ Ссылка
Автор решения: SgadovSG

Это анонимный класс. Просто одноразовая реализация интерфейса Runnable. Такой подход удобен, когда вам не нужна отдельная именованная реализация, и вы не планируете использовать её повторно.

Runnable — это функциональный интерфейс, то есть интерфейс с единственным абстрактным методом. В Java это своего рода костыль для поддержки функционального программирования, ведь в языке нет функций как самостоятельных объектов — есть только методы.

Благодаря функциональным интерфейсам можно, например, сохранять поведение (реализацию метода) в переменную, как в вашем примере, или сразу передавать его в другой метод — без создания отдельной переменной, как здесь вот например

→ Ссылка