这是java中的多重继承吗?为什么java不支持扩展ChildOne、ChildTwo语法?

这是java中的多重继承吗?为什么java不支持扩展ChildOne、ChildTwo语法?,java,Java,我有三节课 ChildTwo public class ChildTwo { public void methodOfChildTwo() { System.out.println("methodOfChildTwo."); } } public class ChildOne extends ChildTwo{ public void methodOfChildOne() { System.out.println("methodOfChi

我有三节课

ChildTwo

public class ChildTwo {
    public void methodOfChildTwo() {
        System.out.println("methodOfChildTwo.");
    }
}
public class ChildOne extends ChildTwo{
    public void methodOfChildOne() {
        System.out.println("methodOfChildOne.");
    }
}
ChildOne扩展了ChildTwo

public class ChildTwo {
    public void methodOfChildTwo() {
        System.out.println("methodOfChildTwo.");
    }
}
public class ChildOne extends ChildTwo{
    public void methodOfChildOne() {
        System.out.println("methodOfChildOne.");
    }
}
扩展ChildOne的父级

public class Parent extends ChildOne{
    public void methodOfParent() {
        System.out.println("methodOfParent.");
    }
}
当我创建父对象时,我可以调用所有三个方法,因为所有这些方法都是在父类中继承的

Parent parent =new Parent();
parent.methodOfParent();
parent.methodOfChildOne();
parent.methodOfChildTwo();
我的问题是

  • 我可以这样说,我可以在Java中实现多重继承吗
  • 这种方法在概念上类似于多个扩展,如
    Parent扩展了ChildOne、ChildTwo(Java不支持这些语法)。为什么Java不支持这种语法,尽管我们可以用上面提到的方法来实现

  • 请有人澄清。

    查看此线程,了解相同的问题:

    最好的答案是麻烦太多,好处太少。实际上,您可以使用接口制作相同的东西


    您可以实现多个接口,因此无需进行多重继承。

    狗既是
    哺乳动物
    又是
    宠物
    。然而宠物并不是哺乳动物。您不能仅使用Java类对
    哺乳动物
    宠物
    之间的关系建模。这是因为Java不支持多重继承


    上述内容在概念上与
    动物
    哺乳动物
    之间的关系并不相似,这是Java支持的。这就是为什么你的问题的“尽管”部分是非顺序的。

    不,它在概念上不相似

    虽然
    Parent
    扩展了
    ChildOne
    ,而ChildOne又扩展了
    ChildTwo
    并从两者继承了方法,但它会导致以下问题:

    ChildOne[] arr = new ChildOne[2];
    arr[0] = new ChildOne();
    arr[1] = new ChildTwo(); // <--- this should have failed
    
    ChildOne[]arr=新的ChildOne[2];
    arr[0]=new ChildOne();
    arr[1]=新的ChildTwo();// 您解释的是“多级继承”

    多级继承->B扩展A.C扩展B。
    多重继承->P扩展Q,R。这在java中是不允许的。对于多重继承,我们使用接口。作为一个类,可以实现任意数量的接口。

    您的示例是多级继承,而不是多重继承

    把继承想象成有父母。你继承父母的财产,反过来又继承他们从祖父母那里得到的财产。你不会称之为多重继承吧

    多类遗传就像从你的父母那里获得基因,然后从其他父母那里(从不同的家谱中)获得基因。在现实生活中没有意义,因为如果你有重复的基因呢?如果你从一对父母那里得到蓝眼基因,从另一对父母那里得到绿眼基因,你会选择哪一个

    在Java中也是一样的:

    下面是一个简单的例子:

    public class A {
        public void doSomething() {
            // Does something
        }
    }
    
    public class B {
        public void doSomething() {
            // Does something else
        }
    }
    
    public class C extends A,B {
        ....
    }
    
    public static void main(String[] args) {
        C newC = new C();
        newC.doSomething();
        // PROBLEM!
    }
    

    应该选择哪个
    doSomething()
    ?没办法说!因此,Java通过不允许多个超类来避免这个问题(我相信还有许多其他问题)。

    首先,Java不支持多重继承,因为它可能导致歧义。(注意:像C++一样的语言支持多继承)。 1.我可以这样说我可以在Java中实现多重继承吗

    这仍然不是多重继承

    请参见下面的图表:

    您给定的代码如右侧的图表所示。多重继承将直接从其所有父级继承所有属性和行为(Java不支持)

    2.这种方法在概念上与多个扩展类似,比如父扩展ChildOne、ChildTwo(Java不支持这些语法)

    实际上,您的方法在概念上与多个扩展不同。Java不支持这一点以防止歧义。假设两个父类都有一个签名相似的方法

    class Bomb{
        public void activate();
    }
    
    class LightBulb{
        public void activate();
    }
    
    class Child extends Bomb, LightBulb{  //Imagine if this is allowed
        //When I call activate(), will it activate the bomb or the lightBulb?
    }
    
    为什么Java不支持这种语法,尽管我们可以用上面提到的方法来实现

    这两种情况都不同,不能通过
    a扩展b
    b扩展c
    实现多重继承。概念上是不同的,因为层次结构完全不同

    在多重继承中,您想要扩展到的两个父类可以是完全不相关的。想象一下,飞马扩展了飞行生物,马

    Pegasus
    是一种
    飞行生物
    ,它也是一种
    ,但是
    飞行生物
    根本不相关

    在给定的示例中,所有后续扩展的父类都是另一个类的子集。它们都是相关的

    哺乳动物
    动物
    狮子
    哺乳动物
    也是
    动物。


    如果您说您提到的方法在概念上类似于多重继承,请考虑以下场景:

    你的任务是从
    飞行类生物
    马类
    创建
    飞马类

    你打算这样做吗?

    class FlyingCreature{
    }
    
    class Horse extends FlyingCreature{   //But Horses do not fly!
    }
    
    class Pegasus extends Horse{  //You got what you want here, but the Horse class is wrong.
    }
    
    class Horse{
    }
    
    class FlyingCreature extends Horse{   //All flying creatures are horses? Are you sure?
    }
    
    //You got what you want here, but the FlyingCreature class is wrong.
    class Pegasus extends FlyingCreature {
    }
    
    还是这个?

    class FlyingCreature{
    }
    
    class Horse extends FlyingCreature{   //But Horses do not fly!
    }
    
    class Pegasus extends Horse{  //You got what you want here, but the Horse class is wrong.
    }
    
    class Horse{
    }
    
    class FlyingCreature extends Horse{   //All flying creatures are horses? Are you sure?
    }
    
    //You got what you want here, but the FlyingCreature class is wrong.
    class Pegasus extends FlyingCreature {
    }
    

    所以现在你们看,这是不可能的,因为两个父类根本不相关。为了在某种程度上实现所谓的“多重继承”,Java使用
    接口

    多重继承将使
    子继承
    同时扩展
    父继承
    母继承
    。您将如何实现这一点?多重继承类似于
    。它不支持多重继承,因为如果ChildOne和ChildTwo使用相同的方法,它将如何确定保留哪个方法以及忽略哪个方法。这看起来很容易,但有些人可能会认为这是有道理的。通过保持简单并只允许单一继承,事物在概念上与(祖母、母亲、女儿)和(母亲)相同