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