Используем абстрактный класс для создания базовой функциональности и общего состояния, которое могут унаследовать подклассы. Он подходит, когда есть общие методы с реализацией и методы, которые должны быть переопределены. Абстрактный класс может иметь поля и конструкторы.
java
Используем интерфейс для определения контракта, описывающего набор методов, которые должны быть реализованы классами. Он подходит для достижения множественного поведения (множественного наследования функциональности). Интерфейс не может иметь состояние (поля экземпляра, кроме констант) и конструкторы (до Java 8).
java
Сводная таблица различий:
| Признак | Абстрактный класс | Интерфейс |
|---|---|---|
| Тип членов | Поля, абстрактные и конкретные методы, конструкторы | Константы, абстрактные методы (по умолчанию), статические и default методы (с Java 8) |
| Реализация методов | Может иметь методы с реализацией | Только абстрактные методы до Java 8, с Java 8 - static and default |
| Состояние | Может иметь состояние (поля) | Не может иметь состояние (поля экземпляра) |
| Наследование | Единичное наследование | Множественная реализация |
| Использование | "является" (is-a) - базовый тип | "имеет возможность" (has-a) - контракт поведения |