Ответ
До Java 8 различия были более явными. Сейчас интерфейсы могут содержать default и static методы, но следующие элементы по-прежнему уникальны для абстрактных классов:
- Конструкторы. Только классы (включая абстрактные) могут иметь конструкторы.
- Поля экземпляра (не-static) с любым модификатором доступа. В интерфейсах все поля неявно
public static final. - Методы с реализацией и модификаторами
privateилиprotected. В интерфейсах методы могут бытьpublic,private(Java 9+) илиdefault/staticс реализацией, но неprotected. - Инициализация состояния объекта через поля и конструкторы.
Пример абстрактного класса:
abstract class Animal {
// Поле экземпляра (нельзя в интерфейсе)
private String name;
protected int age;
// Конструктор (нельзя в интерфейсе)
public Animal(String name) {
this.name = name;
}
// protected метод с реализацией (нельзя в интерфейсе)
protected void eat() {
System.out.println(name + " is eating.");
}
// Абстрактный метод (может быть и в интерфейсе)
abstract void makeSound();
}
Ключевое отличие: Абстрактный класс описывает сущность и может хранить её состояние. Интерфейс описывает контракт или поведение.