Короткий ответ
Множественное наследование — ситуация, когда один класс может иметь более одного непосредственного родителя и наследовать поля и методы сразу от нескольких классов, например class Child extends Mother, Father. Java его не поддерживает: наследование классов одиночное. Зато класс может реализовывать любое количество интерфейсов.
Как это работает подробнее
Главная причина запрета — проблема ромба (diamond problem): если два родительских класса имеют метод с одинаковой сигнатурой, непонятно, какую реализацию должен унаследовать потомок и как корректно разрешить конфликт.
- Интерфейсы. Класс может реализовывать несколько интерфейсов:
implements A, B, C. Начиная с Java 8 интерфейсы могут содержатьdefault-методы с реализацией. - Разрешение конфликта. Если два интерфейса предоставляют
default-методы с одинаковой сигнатурой, класс обязан переопределить метод явно, например вызвавA.super.method(). - Композиция как альтернатива. Вместо жёсткого наследования поведение часто встраивают через объекты других классов как поля. Итог: «один класс — один родитель-класс, но сколько угодно интерфейсов».
Пример кода
DiamondProblem.java
interface A {
default void hello() {
System.out.println("Привет от A");
}
}
interface B {
default void hello() {
System.out.println("Привет от B");
}
}
class C implements A, B {
// конфликт default-методов нужно разрешить явно
@Override
public void hello() {
A.super.hello();
}
}Что использовать на практике
- Моделировать множественное «поведение» через интерфейсы, а не через несколько родительских классов.
- При конфликте
default-методов переопределять метод и явно указывать, какую реализацию выбрать.