Вопрос проверяет знание ключевых различий между интерфейсами и абстрактными классами в Java.
Интерфейс — это контракт с абстрактными методами (до Java 8), а абстрактный класс может содержать реализацию и поля. Интерфейсы поддерживают множественное наследование, а абстрактные классы — нет.
1. Реализация:
Интерфейс:
До Java 8: только абстрактные методы.
С Java 8+: default и static методы.
Абстрактный класс:
Может содержать реализованные методы и поля.
2. Наследование:
Интерфейс: класс может реализовать несколько интерфейсов.
Абстрактный класс: класс может наследовать только один абстрактный класс.
3. Конструкторы:
Интерфейс: не имеет конструкторов.
Абстрактный класс: может иметь конструктор.
Пример:
interface Flyable {
void fly(); // Абстрактный метод
}
abstract class Bird {
String name;
abstract void makeSound(); // Абстрактный метод
void eat() { System.out.println("Eating..."); } // Реализованный метод
}Когда использовать:
Интерфейс: Для определения контракта (например, Comparable, Runnable).
Абстрактный класс: Если нужна общая реализация для родственных классов (например, шаблонный метод).