gpt4 book ai didi

Java : If A extends B and B extends Object, 是多重继承

转载 作者:IT老高 更新时间:2023-10-28 21:05:21 28 4
gpt4 key购买 nike

刚去面试,问了一个问题。

面试官 - Java 是否支持多重继承?

- 不

面试官 - Java 中的每个类都扩展了类 Object(类 Object 除外),如果我们从外部扩展一个类,例如

Class A extends B{
// some code here
}

那么你可以说A类继承了B类和Object类,也就是说它是多重继承的。那么你怎么能说Java不支持多重继承呢?

- 实际上,B 类扩展了 Object 类,因此当您在 A 类中扩展 B 类时,A 类会间接扩展 Object 类。这是多级继承,不是多重继承。

但我的回答并没有让他满意。

我的回答正确吗?或者我错在哪里?
内部实际发生了什么?

最佳答案

My answer is correct?



是的,大多数情况下,当然在您描述的上下文中。这不是多重继承:

Object ^- ClassA ^- ClassB

这就是你所说的,多层次的单一继承。

这是多重继承:从两个或多个彼此没有任何"is"关系的碱基继承;这将继承自不相关的行,或从以前发散的行(在 Java 中,因为 Object 始终是基数,所以应该是后者):

Object ^- ClassA, Object ^- ClassB, ClassA ^- ClassC, ClassB ^- ClassC

(图片来源: http://yuml.me 在“邋遢”模式下)

Internally What happens actually?



正如您所说:有多个级别。当编译器解析实例上的成员时:
obj.member

...查看 obj 的类型(在这种情况下是一个类,比如 ClassB )有 member ,要么是因为它是直接提供的,要么是通过继承获得的。在运行时,JVM 使用 member对象实际上有。

我在上面说“主要”的原因是 Java 有接口(interface),从 Java 8 开始,它在接口(interface)上有“默认方法”。这让事情变得有点复杂,但是根据您描述的面试官所说的 Object,您对级别的回答是正确的。 , ClassA , 和 ClassB .

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

在 Java 8 中,接口(interface)可以提供它们定义的方法的默认实现,这甚至在实际层面也确实模糊了界限。让我们更深入地了解一下:

假设我们有 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继承了 doSomething的实现来自 ClassA .但它也得到了 doSomethingElse 的“默认”版本来自 Interface1 .我们没有在 ClassB 中实现它, 但是 ClassB不是抽象的:它真的有 doSomethingElse .它从界面中获取。我在那里使用了“gets”而不是“inherits”这个词,但这看起来很像继承默认方法。

这基本上是多重继承的“光”(如“淡啤酒”)。它最终解决了真正的多重继承的棘手问题,例如:
  • super应该是什么类型的是? (Java 8 的答案:ClassA)
  • 你以什么顺序运行构造函数? (Java 8 的答案:单谱系构造函数链,接口(interface)没有构造函数。)
  • 您是否运行多次继承的构造函数? (Java 8 的回答:您不能多次继承构造函数,接口(interface)没有它们。)
  • 如果继承多个具有相同签名的方法会发生什么? (Java 8 的答案:如果其中一个来自基类,那就是使用的那个;基类的实现可以覆盖多个接口(interface)的默认方法。如果您在编译时有多个来自不同接口(interface)的具有相同签名的默认方法 -时间,这是一个编译时错误。如果在没有重新编译类的情况下更改了接口(interface)并且这种情况在运行时出现,则是运行时 IncompatibleClassChangeError 异常,列出了冲突的默认方法。)
  • 关于Java : If A extends B and B extends Object, 是多重继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24378375/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com