Что такое абстрактный класс и в чем отличие интерфейса от абстрактного класса?
Что проверяют
Знаете ли вы, что после появления методов по умолчанию разница сузилась, и понимаете ли, что осталось.
Как отвечать
Абстрактный класс это класс, который нельзя создать напрямую. Он может содержать абстрактные методы без тела, обычные методы, поля, конструкторы и любые модификаторы доступа.
Интерфейс описывает контракт. С Java 8 у него есть методы default и static, с Java 9 приватные методы, но состояния у него по-прежнему нет: поля интерфейса это только константы public static final.
Что осталось различного:
- состояние: у абстрактного класса есть поля экземпляра, у интерфейса нет;
- наследование: класс наследует один абстрактный класс, но реализует сколько угодно интерфейсов;
- конструкторы: у абстрактного класса есть, у интерфейса нет;
- доступ: у класса методы бывают
protectedи приватными, у интерфейса всё публичное, кроме приватных вспомогательных; - эволюция: добавить метод в интерфейс без поломки реализаций можно только через
default.
Как выбирать: интерфейс описывает способность («умеет сравниваться», «умеет закрываться»), абстрактный класс задаёт общую основу для родственных типов с общим состоянием и частичной реализацией. Часто применяют вместе: интерфейс как контракт, абстрактный класс как удобная база.
Где спотыкаются
Отвечают «в интерфейсе нет реализации», не зная про default.
Не могут назвать главное отличие, отсутствие состояния.
Считают, что интерфейс всегда лучше, и заводят его на каждый класс с единственной реализацией.
Не знают, что при конфликте одинаковых default методов из двух интерфейсов компилятор потребует явного переопределения.