我有三节课

小孩二

public class ChildTwo {
    public void methodOfChildTwo() {
        System.out.println("methodOfChildTwo.");
    }
}


扩展ChildTwo的ChildOne

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类中继承的。

Parent parent =new Parent();
parent.methodOfParent();
parent.methodOfChildOne();
parent.methodOfChildTwo();


我的问题是


我可以这样说,我可以在Java中实现多重继承吗?
这种方法在概念上类似于多次扩展,例如
Parent extends ChildOne,ChildTwo(Java不支持这些语法)。尽管我们可以通过上述方式实现此目的,但Java为什么不支持此语法?


请有人澄清。

最佳答案

首先,Java不支持多重继承,因为它可能引起歧义。 (注意:像C ++这样的语言确实支持多重继承)。


  1.我可以这样说我可以在Java中实现多重继承吗?


这仍然不是多重继承。

参见下面的图表:



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


  2,这种方法在概念上类似于多重扩展,例如Parent扩展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 extends bb extends c实现多重继承。在概念上不同,因为层次结构完全不同。

在多重继承中,您要扩展到的两个父类都可以完全不相关。想象Pegasus extends FlyingCreature, Horse

PegasusFlyingCreature,也是Horse,但是FlyingCreatureHorse根本不相关。

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

MammalAnimal并且LionMammal也是Animal.



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

您负责从class Pegasusclass FlyingCreature创建class Horse

你要这样做吗?

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使用interface

08-16 17:57