Некоторые отличия между абстрактными классами и интерфейсами в Java:
- Описание функциональности. 3 Интерфейсы описывают только часть функциональности объекта — определённые признаки. 3 Абстрактный класс может описывать целую категорию разных объектов, а его характеристики имеют право наследовать только те объекты, которые являются частью этой категории. 3
- Наличие полей. 3 Интерфейс описывает только поведение (методы), и у него нет полей. 3 В то же время абстрактный класс может содержать классические поля, которые будут принадлежать разным объектам. 3
- Наследование. 12 Класс может наследоваться только от одного абстрактного класса, а класс может реализовывать несколько интерфейсов. 12
- Методы с реализацией. 1 Интерфейс до Java 8 не может содержать методы с реализацией, тогда как абстрактный класс может. 1 С Java 8 интерфейсы могут иметь методы с реализацией (default и static методы). 1
- Модификаторы доступа. 1 Методы и переменные абстрактного класса могут иметь любые модификаторы доступа (private, protected, public). 1 Методы интерфейса неявно public и abstract, поэтому другие модификаторы доступа с методами интерфейса использовать нельзя. 5
Интерфейсы предпочтительны, когда необходимо задать общий контракт для множества разных классов, а абстрактные классы — когда нужно предоставить общую функциональность и базовую реализацию для подклассов. 1