关于java的多重继承的困惑。请阅读以下内容

时间:2013-11-17 15:33:35

标签: java multiple-inheritance

这在java中是允许的

ClassA extends ClassB implements InterfaceA

以及

InterfaceA extends IntefaceB , InterfaceC

如果这些不是多重继承那么它们是什么?

更新

我碰巧用错误的方式说出了这个问题。我最初的问题是为什么java不支持多重继承。

我真正想知道的是:

如果一个接口可以扩展多个接口,或者一个类可以扩展一个类并实现一个接口,那么为什么那些不能被称为多重继承呢?

4 个答案:

答案 0 :(得分:6)

Java 支持多重继承;请注意,支持非常有限:您只能继承多个接口。这就是为什么您听说Java是单继承的原因:它是单个继承。

NB Java 8将使其设计更接近多重继承:interface将被允许定义方法实现,类将确实从多个父项继承实现。通过要求具有冲突的类覆盖该方法,可以有效地解决钻石问题。在该覆盖中,子类将能够单独引用每个超类型实现。

因此,从版本8开始,可以说Java几乎拥有完整的多重继承实现,只需使用手动解决冲突,这与C ++和其他语言不同,后者指定了如何使用编译器会自动解决它们。

答案 1 :(得分:2)

接口和常规类之间的区别在于您无法在接口中指定实现。更清楚的是,您只能指定方法,但不能实现它们。如果您想要多重继承,那么您必须implement多个接口。由于以下原因,Java不支持多重继承。

还要注意接口是关于子类型和多态的,而继承方法是关于代码重用。

来自here

  

从Java语言中省略多重继承的原因   主要源于“简单,面向对象,熟悉”的目标。如   作为一种简单的语言,Java的创建者想要的语言最多   开发人员可以在没有经过广泛培为此,他们   努力使语言尽可能与C ++相似(熟悉)   没有承担C ++不必要的复杂性(简单)。

     

在设计师看来,多重继承会导致更多问题   和它所解决的困惑。所以他们削减了多重继承权   语言(就像它们削减运算符重载一样)。设计师'   丰富的C ++经验教会他们多重继承   不值得头疼。

你可以在同一个地方找到这个有趣的article: -

enter image description here

enter image description here

答案 2 :(得分:2)

As Inheritance定义为:

  

从预先存在的类(称为基类,超类或父类)继承属性和行为

继承是从父类中获取一些实现。如果一个类继承了一个类,则必须有一些子类继承自基类的方法和属性。

但实现接口通常不会添加一些属性或行为。因此,当一个类实现多个接口时,没有其他实现来自接口或者换句话说,我们可以说一个类不能从两个不同的源继承实现。 / p>

不允许多重继承的原因。

(参考维基百科)

Diamond Problem

“钻石问题”(有时被称为“致命的死亡钻石”)是一种歧义,当两个B和C类继承自A,而D类继承自B和C时会出现歧义。如果有A中的方法,B和/或C已被覆盖,而D不覆盖它,那么D继承的方法的哪个版本:B的那个,还是C的那个?

例如,在GUI软件开发的上下文中,Button类可以从Rectangle(用于外观)和Clickable(用于功能/输入处理)类继承,而Rectangle和Clickable类都继承自Object类。现在如果为Button对象调用equals方法并且Button类中没有这样的方法但是在Rectangle或者Clickable(或两者)中有一个重写的equals方法,那么最终应该调用哪个方法?

由于这种情况下类继承图的形状,它被称为“钻石问题”。在本文中,A类位于顶部,B和C分别位于其下方,D将两者连接在一起形成菱形。

  

enter image description here

答案 3 :(得分:1)

Java不支持多重继承。解释第一个例子:

ClassA extends ClassB implements InterfaceA

在这里,ClassA正在扩展单个类,并实现单个接口。而在第二种情况下:

InterfaceA extends IntefaceB, InterfaceC

声明接口从另外两个接口扩展,您可以将其视为从扩展接口“添加”所有方法,但它实际上不是多重继承,实现InterfaceA的类必须提供InterfaceAInterfaceB InterfaceC中定义的所有方法的实现。