Middle
87
questionbank
Когда следует использовать интерфейс, а когда абстрактный класс?
AI答案
sobes.tech AI
Используем абстрактный класс для создания базовой функциональности и общего состояния, которое могут унаследовать подклассы. Он подходит, когда есть общие методы с реализацией и методы, которые должны быть переопределены. Абстрактный класс может иметь поля и конструкторы.
// Абстрактный класс
abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
abstract void makeSound(); // Абстрактный метод
void eat() { // Метод с реализацией
System.out.println(name + " is eating.");
}
}
Используем интерфейс для определения контракта, описывающего набор методов, которые должны быть реализованы классами. Он подходит для достижения множественного поведения (множественного наследования функциональности). Интерфейс не может иметь состояние (поля экземпляра, кроме констант) и конструкторы (до Java 8).
// Интерфейс
interface Flyable {
void fly(); // Абстрактный метод
}
Сводная таблица различий:
| Признак | Абстрактный класс | Интерфейс |
|---|---|---|
| Тип членов | Поля, абстрактные и конкретные методы, конструкторы | Константы, абстрактные методы (по умолчанию), статические и default методы (с Java 8) |
| Реализация методов | Может иметь методы с реализацией | Только абстрактные методы до Java 8, с Java 8 - static and default |
| Состояние | Может иметь состояние (поля) | Не может иметь состояние (поля экземпляра) |
| Наследование | Единичное наследование | Множественная реализация |
| Использование | "является" (is-a) - базовый тип | "имеет возможность" (has-a) - контракт поведения |