Вопрос-ответ

Why is there no multiple inheritance in Java, but implementing multiple interfaces is allowed?

Почему в Java нет множественного наследования, но разрешена реализация нескольких интерфейсов?

Java не допускает множественного наследования, но позволяет реализовать несколько интерфейсов. Почему?

Переведено автоматически
Ответ 1

Потому что интерфейсы указывают только на то, что делает класс, а не на то, как он это делает.

Проблема множественного наследования заключается в том, что два класса могут определять разные способы выполнения одного и того же действия, и подкласс не может выбрать, какой из них выбрать.

Ответ 2

Один из моих преподавателей в колледже объяснил мне это следующим образом:


Предположим, у меня есть один класс, который является Toaster, и другой класс, который является NuclearBomb. У них обоих может быть параметр "darkness". У них обоих есть метод on(). (У одного есть функция off(), у другого нет.) Если я хочу создать класс, который является подклассом обоих из них these...as вы можете видеть, что это проблема, которая действительно может взорваться у меня перед глазами.


Итак, одна из основных проблем заключается в том, что если у вас есть два родительских класса, они могут иметь разные реализации одной и той же функции - или, возможно, две разные функции с одинаковыми именами, как в примере с моим инструктором. Тогда вам придется решать, какой из них будет использоваться вашим подклассом. Конечно, есть способы справиться с этим — C ++ делает это — но разработчики Java посчитали, что это все слишком усложнит.

Однако с интерфейсом вы описываете то, что способен выполнять класс, а не заимствуете метод другого класса для выполнения чего-либо. Вероятность возникновения сложных конфликтов, которые необходимо разрешать, у нескольких интерфейсов гораздо меньше, чем у нескольких родительских классов.

Ответ 3

Поскольку наследованием злоупотребляют, даже когда вы не можете сказать "эй, этот метод выглядит полезным, я также расширю этот класс".

public class MyGodClass extends AppDomainObject, HttpServlet, MouseAdapter, 
AbstractTableModel, AbstractListModel, AbstractList, AbstractMap, ...
Ответ 4

Ответ на этот вопрос заключается во внутренней работе компилятора java (цепочке конструкторов). Если мы увидим внутреннюю работу компилятора Java:

public class Bank {
public void printBankBalance(){
System.out.println("10k");
}
}
class SBI extends Bank{
public void printBankBalance(){
System.out.println("20k");
}
}

После компиляции это выглядит следующим образом:

public class Bank {
public Bank(){
super();
}
public void printBankBalance(){
System.out.println("10k");
}
}
class SBI extends Bank {
SBI(){
super();
}
public void printBankBalance(){
System.out.println("20k");
}
}

когда мы расширяем класс и создаем из него объект, одна цепочка конструкторов будет выполняться до Object класса.

Приведенный выше код будет работать нормально. но если у нас есть другой класс с именем, Car который расширяется Bank, и один гибридный класс (множественное наследование) с именем SBICar:

class Car extends Bank {
Car() {
super();
}
public void run(){
System.out.println("99Km/h");
}
}
class SBICar extends Bank, Car {
SBICar() {
super(); //NOTE: compile time ambiguity.
}
public void run() {
System.out.println("99Km/h");
}
public void printBankBalance(){
System.out.println("20k");
}
}

В этом случае (SBICar) не сможет создать цепочку конструкторов (неоднозначность во время компиляции).

Для интерфейсов это разрешено, потому что мы не можем создать его объект.

Для получения информации о новой концепции default и static методе , пожалуйста, обратитесь к default in interface.

Надеюсь, это решит ваш запрос. Спасибо.

2023-09-26 09:31 java oop inheritance