其实这个问题是由一位面试官问的
问:你怎么能说java不支持多重继承呢?如果Object 类是 java 中所有类的父类。
这个问题我没有答案。
这意味着对 Java 概念没有清晰的概念:-(
例如:如果A 扩展 B
这里 A 已经在扩展 Object 类。对?现在它是如何工作的?
请分享你的答案..
其实这个问题是由一位面试官问的
问:你怎么能说java不支持多重继承呢?如果Object 类是 java 中所有类的父类。
这个问题我没有答案。
这意味着对 Java 概念没有清晰的概念:-(
例如:如果A 扩展 B
这里 A 已经在扩展 Object 类。对?现在它是如何工作的?
请分享你的答案..
多重继承是关于多重直接继承。
单个类不能有两个直接父类。不过,它可以有一个祖父母类。
A extends B
和B extends C
,不等于A extends both B and C
。
不允许这样做的原因是为了简单起见,当您遇到以下情况时:
A extends both B and C
B extends D
C extends D
如果你有这样的情况,那么你有这个代码:
A a = new A();
a.someAbstractOrVirtualMethodOnD();
...您是在谈论 的B
实现someAbstractOrVirtualMethodOnD()
,还是C
相同方法的实现?应该调用哪个?(提示:没有很好的答案)
所以,Java 禁止它。
implement
注意,如果你有多个接口,你可以获得类似于多重继承的东西。但是由于只有一个具体的实现,所以不会混淆调用什么。
最重要的是保持语言设计简单
还有我经常关注的博客中的例子。
1)我们有两个类B和C继承自A。
2)假设B和C正在重写一个继承的方法,并且它们提供了自己的实现。
3) 现在D继承自B和C进行多重继承。D应该继承那个被覆盖的方法,会使用哪个被覆盖的方法?它会来自B还是C?
这里我们有一个歧义。
任何克服这个问题的方法,我们都有接口和多级继承。
编辑 :
And here A is already extending Object class.
那永远不会被称为。那Multiple inheritance
被称为Multi level inheritance.
在多层次中,
涉及许多类inheritance
,但只有一个类扩展one
。最低的subclass
可以利用它的所有super classes
内容。
多重继承意味着一个类可以从多个类继承。换句话说,它可以有多个父类。
对于Object
面试官引用的课堂例子,有两种可能:
面试官自己对多父类(多继承)和多子类感到困惑。
或者他试图用那个问题来欺骗你
一个父类可以有许多子类,这与多重继承无关。
看看这个 StackOverflow 答案:https ://stackoverflow.com/a/9790475/2619912
您的类扩展了另一个类,但它也扩展了 Object,因此您仍然处于一行继承中,而不是两行。
多重继承是单个类可以从多个类扩展的地方。这在java中是不可能的。见这里:http ://en.wikipedia.org/wiki/Multiple_inheritance
当您class A extends B
在 Java 中执行时,则仅A
扩展B
,而不是Object
. B
反过来扩展Object
(或其他任何东西,最终将扩展对象)
java 中多重继承的唯一相似之处是Interfaces
. 一个类可以实现多个接口。
Object
类不是多重继承的例子。可能是你误解了这个问题。
这是对 Java 的常见误解。
多重继承的工作方式(在 C++ 和 Python 中)是这样的。
Parent1 Parent2 Parent3
| | |
_______________________
|
v
Child
这意味着Child
它将继承所有父母的属性和方法。
但是,在 Java 中,继承是这样工作的。
Object
|
v
Child1
|
v
Grandchild
所以,object 是所有类的超类,但它不是所有类的直接父类。然而,Java 确实提供了一种通过以下方式在一定程度上实现多重继承的方法Interfaces
Object
|
v
Child <--- Interface
|
v
Grandchild
现在,Grandchild
将继承方法Child
,然后有义务实现接口中定义的方法[除非它是抽象类,但这完全是单独的讨论]
所以,Object 是所有类的祖先,但不是所有类的父类,Java也不支持多重继承。
答案是 Java 支持多级继承,但不支持多级继承。
多重继承应该允许一个类继承多个父类。但是 Java 不允许这样做,因为它可能会产生Diamond 问题
关于Object
类是父类,然后在继承层次结构中有许多类,称为多级继承
边注:
C#允许通过接口进行多重继承,即使它们具有相同的签名,也允许子类型分别实现多个父类型的方法
请参考:http ://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
在 Object 类到其他类的情况下,它实际上不是多重继承......如前所述,它的单个类可以从多个类扩展......
java 类只能是单个父类的直接子类。它可以有祖父母,但没有第二父母。这就像有一个单亲生母亲。你不能有一个以上的亲生母亲,当然你可以有一个祖母。
假设有一个类 A 和类 B。现在我们定义一个类 Derived。多重继承意味着:派生类可以同时继承A类和B类。但这在Java中是不可能的。因此它不支持多重继承。
问:你怎么能说java不支持多重继承呢?如果 Object 类是 java 中所有类的父类。
Object 是所有类(父亲、祖父、曾祖父等)的祖先,但每个类只有一个父亲(如果未指定,则为 Object 类)。
第一种情况:假设您创建了一个类 A 而不使用继承。默认情况下,它是从 Object 类派生的。
第二种情况:假设您创建了扩展类 A 的类 B。类 A 包含 Object 类的所有字段,因此类 B 也将通过继承包含它们。它是
class B extends A(which extends Object)
,所以你可以说 B 是 A 的子类,也是 Object 的子类。