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