栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java:如果A扩展了B和B扩展了对象,是多重继承吗

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java:如果A扩展了B和B扩展了对象,是多重继承吗

是的,大多数情况下,当然也可以根据您所描述的情况。这不是多重继承:

就是您所说的,具有多个级别的单一继承。

这是多重继承:从两个或多个彼此没有任何“ is”关系的碱基继承;将从不相关的行继承,或从先前分歧的行继承(在Java中,由于Object始终是基础,因此将是后者):

就是你所说的:有多个层次。当编译器解析实例上的成员时:

obj.member

…它看起来要查看其类型obj(在这种情况下是一个类,例如ClassB)是否具有member,因为它是直接提供的还是通过继承获得的。在运行时,JVM使用member对象实际拥有的对象。

我上面说“主要”的原因是Java具有接口,而从Java 8开始,它在接口上具有“默认方法”。这会使事情变得复杂了一点,但你对各级答案是你所描述的面试官说关于上下文正确

Object
ClassA
ClassB

在Java中,接口始终使某种事物具有两种不同类型的“是”关系成为可能:继承自的类类型以及实现的几种接口类型中的任何一种。没有默认方法的接口实际上并不是多重继承的(类必须提供实现),但是它们的确使类从不相关的类型树中具有多个“是”关系成为可能。(我不是学术人员,学术人员可能会争辩说他们以学术方式提供多重继承。)

使用Java 8,接口可以提供它们定义的方法的默认实现,即使在实际水平上,这也确实使界限模糊了。让我们更深入地看一下:

说我们有

ClassA

class ClassA {    void doSomething() {        // Code here    }}

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
。它从接口获取它。我用这个词“被”,而不是“继承”有,但这个看上去一个很多像继承的默认方法。

这基本上是多重继承的“轻度啤酒”(如“轻啤酒”中的)。它通过真正的多重继承来解决棘手的问题,例如:

  • 应该是什么类型
    super
    ?(Java的8的答案:
    ClassA
  • 你以什么顺序运行构造函数?(Java 8的答案:单谱系构造函数链接,接口没有构造函数。)
  • 你是否运行了多次继承的构造函数?(Java 8的答案:你不能多次继承构造函数,接口没有它们。)
  • 如果你继承具有相同签名的多个方法会怎样?(Java 8的回答:如果其中之一来自基类,那就是使用的那个;基类的实现可以覆盖多个接口的默认方法。如果你在编译时具有来自不同接口的具有相同签名的多个默认方法,如果在不重新编译类的情况下更改了接口,并且在运行时出现这种情况,则它是一个运行时
    IncompatibleClassChangeError
    异常,列出了冲突的默认方法。)


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/407728.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号