面试官:为什么 Java 不支持类多重继承?一下被问懵了!

火焰蓝程猿

共 2306字,需浏览 5分钟

 ·

2023-08-28 15:25

关注公众号,学习更多 Java 干货! dc32e3e49453fff4b5720508c55ccf9d.webp

点下面 ↓↓↓ 小程序刷题进大厂        

我发现这个问题很难回答,因为答案可能不会让面试官满意,在大多数情况下,面试官正在寻找答案中的关键点,如果你提到这些关键点,面试官会很高兴。

在 Java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。

这是非常经典的问题,与为什么 String 在 Java 中是不可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。

为什么 Java 不支持类多重继承, 可以考虑以下两点:

1、 第一个原因围绕钻石💎形继承问题产生的歧义

考虑一个类 A 有 foo() 方法, 然后 B 和 C 派生自 A, 并且有自己的 foo() 实现,现在 D 类使用多个继承派生自 B 和 C。

如果我们只引用 foo(), 编译器将无法决定它应该调用哪个 foo(),这也称为 Diamond 问题,因为这个继承方案的结构类似于菱形,见下图:

      
                        A foo()      
               / \      
             /     \      
 foo() B     C foo()      
             \     /      
               \ /      
               D  foo()  

即使我们删除钻石的顶部 A 类并允许多重继承,我们也将看到这个问题含糊性的一面。如果你把这个理由告诉面试官,他会问为什么 C++ 可以支持多重继承而 Java不行。

嗯,在这种情况下,我会试着向他解释我下面给出的第二个原因,它不是因为技术难度, 而是更多的可维护和更清晰的设计是驱动因素, 虽然这只能由 Java 言语设计师确认,我们只是推测。

维基百科链接有一些很好的解释,说明在使用多重继承时,由于钻石问题,不同的语言地址问题是如何产生的。

2、对我来说第二个也是更有说服力的理由是,多重继承确实使设计复杂化并在强制转换构造函数链接等过程中产生问题。

假设你需要多重继承的情况并不多,简单起见,明智的决定是省略它。

此外,Java 可以通过使用接口支持多继承来避免这种歧义。由于接口只有方法声明而且没有提供任何实现,因此只有一个特定方法的实现,因此不会有任何歧义。

作者:Yujiaao
https://segmentfault.com/a/1190000019962661



课程推荐

Spring 6 和 Spring Boot  3.0 都要求最低 JDK 17+,必须尽早学习了,栈长制作了《 Java 17 新特性实战课 》,不管是新特性、还是性能,JDK 17 都是一个里程碑式的提升。 课程非常全面,几乎覆盖了  JDK 9 ~ 17  所有核心知识点,市面上几乎没有, 已全部完结,可随时报名学习全部内容。

对 JDK 17 感兴趣的扫码报名学习:

👉  课程详细介绍: Java 17 新特性实战课

课程原价 199 元,现在刚上市半价 99 元即可上车,想学习全新 Java 技术的尽快上车,不管是用来面试跳槽,还是工作所需,都是相当有必要的。

浏览 24
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报