Sobes.tech
Middle
88
questionbank

Когда следует использовать интерфейс, а когда абстрактный класс?

Ответ от нейросети

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) - контракт поведения