我刚刚有人问我一个问题。
问 -Java是否支持多重继承?
我 -不
问-Java中的每个类都扩展了类Object(类Object除外),如果我们从外部扩展了一个类,例如
Class A extends B{ // some code here }
那么你可以说A类扩展了B类和Object类,这意味着它是多重继承。那么怎么说Java不支持多重继承呢?
我 -实际上,类B扩展了类Object,因此,当你在类A中扩展类B时,类A间接扩展了类Object。这是多级继承,而不是多继承。
但是我的回答使他不满意。
我的答案正确吗?还是我在哪里错?内部实际发生了什么?
是的,大多数情况下,当然也可以根据您所描述的情况。这不是多重继承:
就是您所说的,具有多个级别的单一继承。
这是多重继承:从两个或多个彼此没有任何“ is”关系的碱基继承;将从不相关的行继承,或从先前分歧的行继承(在Java中,由于Object始终是基础,因此将是后者):
就是你所说的:有多个层次。当编译器解析实例上的成员时:
obj.member
…它看起来要查看其类型obj(在这种情况下是一个类,例如ClassB)是否具有member,因为它是直接提供的还是通过继承获得的。在运行时,JVM使用member对象实际拥有的对象。
我上面说“主要”的原因是Java具有接口,而从Java 8开始,它在接口上具有“默认方法”。这会使事情变得复杂了一点,但你对各级答案是你所描述的面试官说关于上下文正确Object,ClassA和ClassB。
Object
ClassA
ClassB
在Java中,接口始终使某种事物具有两种不同类型的“是”关系成为可能:继承自的类类型以及实现的几种接口类型中的任何一种。没有默认方法的接口实际上并不是多重继承的(类必须提供实现),但是它们的确使类从不相关的类型树中具有多个“是”关系成为可能。(我不是学术人员,学术人员可能会争辩说他们以学术方式提供多重继承。)
使用Java 8,接口可以提供它们定义的方法的默认实现,即使在实际水平上,这也确实使界限模糊了。让我们更深入地看一下:
说我们有ClassA:
class ClassA { void doSomething() { // Code here } }
和Interface1:
Interface1
interface Interface1 { default void doSomethingElse() { // Requires Java 8 // Code here } }
最后ClassB:
class ClassB extends ClassA implements Interface1 { }
ClassB继承doSomethingfrom 的实现ClassA。但它也获得了“默认”版本doSomethingElse从Interface1。我们没有在中实现它ClassB,但ClassB不是抽象的:它确实具有doSomethingElse。它从接口获取它。我用这个词“被”,而不是“继承”有,但这个看上去一个很多像继承的默认方法。
doSomethingfrom
doSomethingElse
这基本上是多重继承的“轻度啤酒”(如“轻啤酒”中的)。它通过真正的多重继承来解决棘手的问题,例如:
super
IncompatibleClassChangeError