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
Поскольку наследованием злоупотребляют, даже когда вы не можете сказать "эй, этот метод выглядит полезным, я также расширю этот класс".
когда мы расширяем класс и создаем из него объект, одна цепочка конструкторов будет выполняться до Object класса.
Приведенный выше код будет работать нормально. но если у нас есть другой класс с именем, Car который расширяется Bank, и один гибридный класс (множественное наследование) с именем SBICar: