Что такое интерфейс в ООП и какова его роль?

«Что такое интерфейс в ООП и какова его роль?» — вопрос из категории ООП, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Интерфейс — это абстрактный тип, который определяет контракт (набор методов), который должны реализовать классы. Он описывает что должен делать объект, но не как он это делает.

Основные цели и преимущества интерфейсов:

  • Абстракция и полиморфизм: Позволяют работать с объектами через их общий интерфейс, а не конкретную реализацию. Это основа принципа «программируйте на уровне интерфейсов, а не реализаций».
    List<String> list = new ArrayList<>(); // Ссылка типа интерфейса
    list = new LinkedList<>(); // Легкая замена реализации
  • Множественное «наследование»: Класс в Java может реализовать множество интерфейсов, что компенсирует отсутствие множественного наследования классов.
  • Слабая связанность (Loose Coupling): Код зависит от абстракции (интерфейса), а не от конкретного класса. Это упрощает тестирование (можно использовать моки) и модификацию системы.
  • Определение ролей: Интерфейс может определять специфическую роль объекта (например, Comparable, Runnable, Serializable).

Пример:

// Контракт для объектов, которые можно отрисовать
interface Drawable {
    void draw();
    default void printInfo() { // default-метод (Java 8+)
        System.out.println("This is a drawable object.");
    }
}

// Контракт для объектов с цветом
interface Colored {
    String getColor();
}

// Класс реализует два интерфейса
class Circle implements Drawable, Colored {
    private String color;

    public Circle(String color) { this.color = color; }

    @Override
    public void draw() {
        System.out.println("Drawing a " + color + " circle.");
    }

    @Override
    public String getColor() {
        return color;
    }
}

// Использование
Drawable drawable = new Circle("red");
drawable.draw(); // Drawing a red circle.
drawable.printInfo(); // This is a drawable object.

Роль: Интерфейсы являются фундаментальным механизмом для проектирования гибких, расширяемых и поддерживаемых систем, соответствующих принципам SOLID (в частности, принципам разделения интерфейса и зависимости от абстракций).