Что проверяет вопрос про default-методы в интерфейсах

Начиная с Java 8 интерфейс может нести реализацию — default-метод. Формально это ввели для эволюции API: добавить метод в интерфейс без поломки всех существующих имплементаций. На собеседовании проверяют другое — понимаете ли вы, что это форма множественного наследования поведения, и знаете правило разрешения конфликта.

Если класс implements два интерфейса с одинаковой сигнатурой default-метода, компилятор не выбирает один произвольно. Он требует явного override в классе — иначе ошибка компиляции ещё до запуска.

interface A { default String name() { return "A"; } }

interface B { default String name() { return "B"; } }

class C implements A, B { @Override public String name() { return A.super.name()

Синтаксис A.super.name() — единственный способ явно выбрать реализацию конкретного интерфейса. Просто super.name() здесь не скомпилируется: неоднозначно, какой родитель имеется в виду.

Следом почти всегда спрашивают: а если один интерфейс наследует другой и переопределяет default-метод — какая реализация выигрывает? Ответ: более конкретный интерфейс в иерархии выигрывает автоматически, конфликт возникает только между несвязанными интерфейсами одного уровня.

Default-методы дали интерфейсам поведение, но не превратили их в абстрактные классы — состояния там всё ещё нет.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки