ENIGMA AI
ENIGMA AI

В чем отличие интерфейса от абстрактного класса?

встречается 4× junior oop

Как ответить

Основное отличие в том, что интерфейс задаёт контракт (что должно быть), а абстрактный класс — частичную реализацию (что уже есть + что нужно доделать). В Java и C# это закреплено синтаксически: класс может реализовать много интерфейсов, но унаследовать только один абстрактный класс.

На практике это выглядит так:

  • Интерфейс — только сигнатуры методов (до Java 8). Пример: Comparable требует метод compareTo(), но не даёт готового кода. Если два класса реализуют один интерфейс, их можно использовать полиморфно через общий тип.
  • Абстрактный класс — может содержать поля, конструкторы, реализованные методы. Например, AbstractList в Java уже реализует add() и remove() через get() и size(), оставляя только их абстрактными. Наследник пишет только специфику.

Ключевые различия:

  • Наследование: интерфейсов — множественное, абстрактных классов — одиночное.
  • Состояние: в интерфейсе нет полей (только константы), в абстрактном классе — любые поля.
  • Конструкторы: у интерфейса их нет, у абстрактного класса — есть.
  • Модификаторы доступа: в интерфейсе методы public по умолчанию, в абстрактном классе — любые.

Пример кода на Java:

// Интерфейс — только контракт
public interface Drawable {
    void draw();
}

// Абстрактный класс — частичная реализация
public abstract class Shape {
    protected int x, y;
    
    public Shape(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    public void move(int dx, int dy) {
        x += dx;
        y += dy;
    }
    
    public abstract double area();
}

// Конкретный класс
public class Circle extends Shape implements Drawable {
    private int radius;
    
    public Circle(int x, int y, int radius) {
        super(x, y);
        this.radius = radius;
    }
    
    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
    
    @Override
    public void draw() {
        System.out.println("Рисую круг в (" + x + "," + y + ")");
    }
}

Когда что выбирать:

  • Интерфейс — если нужно описать поведение, которое может быть у разных несвязанных классов (например, Serializable, Runnable).
  • Абстрактный класс — если классы логически связаны и имеют общую базу (например, разные виды животных с общими полями и методами).

В современных языках (Java 8+, C# 8+) интерфейсы получили default-методы, что немного размыло границу, но концептуально разница остаётся: интерфейс — это способность (can do), абстрактный класс — сущность (is a).

Ключевые тезисы

  • Интерфейс задаёт контракт (только сигнатуры), абстрактный класс — частичную реализацию
  • Множественное наследование интерфейсов против одиночного для абстрактных классов
  • Интерфейс не имеет состояния (полей) и конструкторов, абстрактный класс — может
  • Выбор: интерфейс для поведения (Runnable), абстрактный класс для общей базы (Animal)
  • Default-методы в интерфейсах (Java 8+) не отменяют концептуальную разницу

Что спросят дальше

  • — Может ли абстрактный класс не иметь абстрактных методов? Зачем он тогда нужен?
  • — В чём разница между интерфейсом и абстрактным классом в контексте DI (внедрения зависимостей)?
  • — Как изменилась бы архитектура, если бы в Java убрали абстрактные классы и оставили только интерфейсы с default-методами?

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение