Ответ
Java запрещает множественное наследование классов для устранения проблемы "алмаза смерти" (Diamond Problem). Эта проблема возникает, когда класс наследует от двух родителей, имеющих метод с одинаковой сигнатурой, и компилятор не может определить, какую реализацию использовать.
Почему это проблема?
- Неоднозначность вызова: Если класс
Cнаследует отAиB, и оба родителя имеют методvoid foo(), то вызовC.foo()становится неоднозначным. - Конфликт состояния: Классы могут иметь поля, и множественное наследование привело бы к сложностям в управлении инициализацией и состоянием объекта.
Решение в 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");
}
}