我有三节课
小孩二
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 b
,b extends c
实现多重继承。在概念上不同,因为层次结构完全不同。在多重继承中,您要扩展到的两个父类都可以完全不相关。想象
Pegasus extends FlyingCreature, Horse
。Pegasus
是FlyingCreature
,也是Horse
,但是FlyingCreature
和Horse
根本不相关。在给定的示例中,所有后续扩展的父类都是另一个子集。它们都是相关的。
Mammal
是Animal
并且Lion
是Mammal
也是Animal.
如果您说您提到的方法在概念上类似于多重继承,请考虑以下情形:
您负责从
class Pegasus
和class 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
。