Ответ
Выбор зависит от конкретных требований к проектированию.
Выберите ИНТЕРФЕЙС, если:
- Вам нужен контракт без реализации (чистая абстракция).
- Требуется поддержка множественного «наследования» (класс может реализовать много интерфейсов).
- Вы хотите определить функциональный интерфейс для использования с лямбда-выражениями.
- Нет необходимости в общем состоянии (не-final полях) для всех реализаций.
Выберите АБСТРАКТНЫЙ КЛАСС, если:
- У наследников есть общая реализация (шаблонный метод) или состояние (не-static поля).
- Вам нужны модификаторы доступа
protectedдля методов или полей, чтобы скрыть их от внешнего мира, но открыть для наследников. - Вы планируете расширять функциональность существующего класса (наследование).
Пример сравнения:
// Интерфейс: определяет контракт для возможности отрисовки
interface Drawable {
void draw(); // Только сигнатура метода
}
// Абстрактный класс: предоставляет общую логику и состояние для фигур
abstract class Shape {
protected String color; // Общее состояние для наследников
abstract double area(); // Абстрактный метод, который нужно реализовать
// Общая реализация (не-абстрактный метод)
public String getColor() {
return color;
}
}
Современный подход (Java 8+): Интерфейсы с default-методами позволяют добавлять реализацию, что сокращает необходимость в абстрактных классах, но они по-прежнему не могут содержать не-final поля состояния.