Абстрактный класс следует использовать, когда:
- Необходимо определить общую базовую функциональность с возможностью реализации части методов.
- Требуется совместное использование состояния (полей) между подклассами.
- Предполагается, что подклассы будут иметь тесную "is-a" связь с базовым классом.
- Необходима возможность добавлять новые методы в абстрактный класс в будущем без нарушения существующих реализаций.
Интерфейс следует использовать, когда:
- Необходимо определить контракт поведения без какой-либо реализации.
- Классы могут реализовывать несколько различных контрактов (интерфейсов), так как Java не поддерживает множественное наследование классов.
- Необходимо отделить определение функциональности от ее реализации.
- Требуется гибкость и слаженность связей между компонентами системы.
Пример абстрактного класса:
java