Чем интерфейс отличается от абстрактного класса и что изменили default-методы?
- Интерфейс или абстрактный класс — как выбирать?
- Чем интерфейс отличается от абстрактного класса?
- Интерфейс или абстрактный класс: как выбираешь и что изменили default-методы?
Интерфейс — контракт: класс может реализовать много интерфейсов, состояния (полей экземпляра) нет. Абстрактный класс — общая база с состоянием, конструктором и частичной реализацией; наследуется один. default-методы (Java 8) дали интерфейсам код для эволюции API, но не состояние.
- Нужен контракт для разных иерархий — интерфейс
- Общий код с состоянием для родственных классов — абстрактный класс
- На практике чаще интерфейс плюс, при нужде, абстрактная базовая реализация (AbstractList)
А ещё В интерфейсах есть static и private-методы (Java 9), поля — только константы
Подробно
| интерфейс | абстрактный класс | |
|---|---|---|
| наследование | много интерфейсов | один класс |
| состояние | только константы | любые поля |
| конструктор | нет | есть |
| методы | 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-метод интерфейса или метод суперкласса?
Разбор темы
- Интерфейсы против абстрактных классов
Контракт против частичной реализации, default/static/private-методы, разрешение конфликта default-методов и критерий выбора.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.