Что проверяет вопрос про 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()
- B.super.name(); } }
Синтаксис A.super.name() — единственный способ явно выбрать реализацию конкретного интерфейса. Просто super.name() здесь не скомпилируется: неоднозначно, какой родитель имеется в виду.
Следом почти всегда спрашивают: а если один интерфейс наследует другой и переопределяет default-метод — какая реализация выигрывает? Ответ: более конкретный интерфейс в иерархии выигрывает автоматически, конфликт возникает только между несвязанными интерфейсами одного уровня.
Default-методы дали интерфейсам поведение, но не превратили их в абстрактные классы — состояния там всё ещё нет.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки