Получить доступ

Сколько интерфейсов может реализовать один класс в Java?

JuniorООП
Ещё спрашивают так:
  • Есть ли в Java множественное наследование?
  • Почему класс может наследовать только один класс?
  • Что такое проблема ромба и как её решают default-методы?
Коротко

Интерфейсов — сколько угодно, класс-родитель — только один.

  • Множественное наследование классов запрещено из-за конфликта состояния и реализаций
  • У интерфейса нет полей-состояния, поэтому реализовать можно много

А ещё С default-методами конфликт возможен — класс обязан переопределить метод явно

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

В Java класс наследует ровно один класс (extends), но реализует любое число интерфейсов (implements A, B, C).

Почему так: при множественном наследовании классов возникает неоднозначность — «проблема ромба». Если два родителя содержат поле или метод с одинаковым именем, непонятно, что наследует потомок, и как инициализировать состояние двух родителей. Java избегает этого, разрешая только одного родителя-класса.

У интерфейсов нет состояния экземпляра, поэтому реализовать несколько безопасно. Интерфейс описывает роль объекта: класс может быть одновременно Comparable, Serializable и AutoCloseable.

С Java 8 у интерфейсов есть default-методы с реализацией, и конфликт снова возможен: если два интерфейса дают default-метод с одной сигнатурой, компилятор потребует переопределить его в классе и, при желании, вызвать нужный вариант через A.super.method().

Пример

interface Flyer   { default String move() { return "fly"; } }
interface Swimmer { default String move() { return "swim"; } }

class Duck implements Flyer, Swimmer {
    @Override
    public String move() { return Flyer.super.move() + " and " + Swimmer.super.move(); }
}

Что хотят услышать

  • Ответ: интерфейсов сколько угодно, родитель-класс один.
  • Причина — проблема ромба и состояние.
  • Интерфейс как роль объекта.
  • Конфликт default-методов и его решение — плюс.

Частые ошибки

  • Считать, что интерфейсы полностью заменяют абстрактные классы.
  • Забывать, что состояние в интерфейсе объявить нельзя.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Сколько угодно — в отличие от наследования классов, которое допускает только один родитель
  • ✗Не более одного
  • ✗Не более двух
  • ✗Столько же, сколько классов он наследует

Что спросят дальше

  • Что произойдёт при конфликте одинаковых default-методов?
  • Когда выбирают абстрактный класс, а не интерфейс?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем