这是java中的多重继承吗?为什么java不支持扩展ChildOne、ChildTwo语法?
我有三节课 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
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();
我的问题是
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使用相同的方法,它将如何确定保留哪个方法以及忽略哪个方法。这看起来很容易,但有些人可能会认为这是有道理的。通过保持简单并只允许单一继承,事物在概念上与(祖母、母亲、女儿)和(母亲)相同