Почему в Java запрещено множественное наследование классов?

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

Ответ

Java запрещает множественное наследование классов для устранения проблемы "алмаза смерти" (Diamond Problem). Эта проблема возникает, когда класс наследует от двух родителей, имеющих метод с одинаковой сигнатурой, и компилятор не может определить, какую реализацию использовать.

Почему это проблема?

  1. Неоднозначность вызова: Если класс C наследует от A и B, и оба родителя имеют метод void foo(), то вызов C.foo() становится неоднозначным.
  2. Конфликт состояния: Классы могут иметь поля, и множественное наследование привело бы к сложностям в управлении инициализацией и состоянием объекта.

Решение в Java: Java поддерживает множественное наследование типов через интерфейсы. Начиная с Java 8, интерфейсы могут содержать реализации по умолчанию (default методы). Конфликты между default-методами разрешаются явным переопределением в классе.

Пример разрешения конфликта default-методов:

interface A {
    default void foo() {
        System.out.println("A");
    }
}

interface B {
    default void foo() {
        System.out.println("B");
    }
}

class C implements A, B {
    // Компилятор требует явного разрешения конфликта
    @Override
    public void foo() {
        // Можно выбрать реализацию одного из интерфейсов
        A.super.foo(); // Явный вызов метода из интерфейса A
        // Или предоставить свою собственную реализацию
        System.out.println("C");
    }
}