这在java中是允许的
ClassA extends ClassB implements InterfaceA
以及
InterfaceA extends IntefaceB , InterfaceC
如果这些不是多重继承那么它们是什么?
更新
我碰巧用错误的方式说出了这个问题。我最初的问题是为什么java不支持多重继承。
我真正想知道的是:
如果一个接口可以扩展多个接口,或者一个类可以扩展一个类并实现一个接口,那么为什么那些不能被称为多重继承呢?
答案 0 :(得分:6)
Java 支持多重继承;请注意,支持非常有限:您只能继承多个接口。这就是为什么您听说Java是单继承的原因:它是单个类继承。
NB Java 8将使其设计更接近多重继承:interface
将被允许定义方法实现,类将确实从多个父项继承实现。通过要求具有冲突的类覆盖该方法,可以有效地解决钻石问题。在该覆盖中,子类将能够单独引用每个超类型实现。
因此,从版本8开始,可以说Java几乎拥有完整的多重继承实现,只需使用手动解决冲突,这与C ++和其他语言不同,后者指定了如何使用编译器会自动解决它们。
答案 1 :(得分:2)
接口和常规类之间的区别在于您无法在接口中指定实现。更清楚的是,您只能指定方法,但不能实现它们。如果您想要多重继承,那么您必须implement
多个接口。由于以下原因,Java不支持多重继承。
还要注意接口是关于子类型和多态的,而继承方法是关于代码重用。
来自here:
从Java语言中省略多重继承的原因 主要源于“简单,面向对象,熟悉”的目标。如 作为一种简单的语言,Java的创建者想要的语言最多 开发人员可以在没有经过广泛培为此,他们 努力使语言尽可能与C ++相似(熟悉) 没有承担C ++不必要的复杂性(简单)。
在设计师看来,多重继承会导致更多问题 和它所解决的困惑。所以他们削减了多重继承权 语言(就像它们削减运算符重载一样)。设计师' 丰富的C ++经验教会他们多重继承 不值得头疼。
你可以在同一个地方找到这个有趣的article: -
答案 2 :(得分:2)
As Inheritance定义为:
从预先存在的类(称为基类,超类或父类)继承属性和行为
继承是从父类中获取一些实现。如果一个类继承了一个类,则必须有一些子类继承自基类的方法和属性。
但实现接口通常不会添加一些属性或行为。因此,当一个类实现多个接口时,没有其他实现来自接口或者换句话说,我们可以说一个类不能从两个不同的源继承实现。 / p>
不允许多重继承的原因。
(参考维基百科)
“钻石问题”(有时被称为“致命的死亡钻石”)是一种歧义,当两个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将两者连接在一起形成菱形。
答案 3 :(得分:1)
Java不支持多重继承。解释第一个例子:
ClassA extends ClassB implements InterfaceA
在这里,ClassA
正在扩展单个类,并实现单个接口。而在第二种情况下:
InterfaceA extends IntefaceB, InterfaceC
声明接口从另外两个接口扩展,您可以将其视为从扩展接口“添加”所有方法,但它实际上不是多重继承,实现InterfaceA
的类必须提供InterfaceA
,InterfaceB
和 InterfaceC
中定义的所有方法的实现。