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

Чем интерфейс отличается от абстрактного класса и что изменили default-методы?

MiddleООП
Ещё спрашивают так:
  • Интерфейс или абстрактный класс — как выбирать?
  • Чем интерфейс отличается от абстрактного класса?
  • Интерфейс или абстрактный класс: как выбираешь и что изменили default-методы?
Коротко

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

  • Нужен контракт для разных иерархий — интерфейс
  • Общий код с состоянием для родственных классов — абстрактный класс
  • На практике чаще интерфейс плюс, при нужде, абстрактная базовая реализация (AbstractList)

А ещё В интерфейсах есть static и private-методы (Java 9), поля — только константы

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

Подробно

интерфейсабстрактный класс
наследованиемного интерфейсоводин класс
состояниетолько константылюбые поля
конструкторнетесть
методыabstract, default, static, privateлюбые
модификаторы доступаметоды public (кроме private)любые

Когда интерфейс: нужен контракт, который могут реализовать классы из разных иерархий (Comparable, Runnable, Repository); нужна множественная «роль». Хорошо мокается в тестах.

Когда абстрактный класс: у родственных классов общее состояние и код, работающий с ним; нужен конструктор с проверками; нужны protected поля и методы.

Что изменили default-методы. В интерфейс теперь можно добавить метод с реализацией, не сломав существующие реализации — так в Java 8 появились Collection.stream() и Iterable.forEach(). Но состояния у интерфейса нет, поэтому default-метод может опираться только на другие методы интерфейса. Конфликт одинаковых default-методов из двух интерфейсов класс обязан разрешить сам.

Частый идиом JDK: интерфейс List + AbstractList с общей реализацией + конкретные классы.

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

  • Различия по наследованию, состоянию, конструктору.
  • Критерий выбора.
  • Роль default-методов и их ограничение.

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

  • Считать, что интерфейсы не имеют реализации (есть default-методы).
  • Думать про множественное наследование классов.

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

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

Показать варианты и ответ
  • ✗Класс может наследовать несколько абстрактных классов
  • ✓Класс реализует несколько интерфейсов, но наследует только один класс
  • ✗Интерфейс не может содержать реализацию методов
  • ✗Абстрактный класс не может иметь конструктор

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

  • Что такое default-метод и проблема ромба?
  • Когда выбрать абстрактный класс, а не интерфейс?
  • Что такое default method conflict?
  • Почему композиция часто лучше наследования?
  • Зачем интерфейсу private-методы?
  • Что победит: default-метод интерфейса или метод суперкласса?

Разбор темы

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

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

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

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

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