Sobes.tech
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) - договор за поведение