Короткий ответ
Множественное наследование — ситуация, когда один класс может иметь более одного непосредственного родителя и наследовать поля и методы сразу от нескольких классов, например 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-методов переопределять метод и явно указывать, какую реализацию выбрать. - Для переиспользования реализации без наследования применять композицию (делегирование).
Подводные камни
- Утверждать, что Java вообще не поддерживает множественное наследование: множественная реализация интерфейсов поддерживается.
- Забывать, что конфликт двух
default-методов с одинаковой сигнатурой требует явного разрешения. - Пытаться имитировать наследование от двух классов обходными трюками вместо композиции — код станет хрупким.
Как отвечать на собеседовании
- Каркас ответа: дайте определение множественного наследования → чётко ответьте: в Java классовое наследование одиночное → назовите причину: diamond problem → расскажите, что вместо этого: много интерфейсов и default-методы → упомяните композицию как более гибкую альтернативу.