首页 > 编程语言 >Java面试题支招-为什么Java语言不支持多继承

Java面试题支招-为什么Java语言不支持多继承

时间:2023-10-15 13:01:23浏览次数:36  
标签:面试题 调用 Java 构造方法 继承 子类 支招 foo

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

Java 不支持类的多继承。因为多继承会增加编程的复杂性。下图选自孙卫琴的经典Java书籍《漫画Java编程》

Java面试题支招-为什么Java语言不支持多继承_多重继承

当一个子类有多个父类可能出现的混乱

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

1、第一个原因是围绕钻石问题产生的歧义,考虑一个类 A 有 foo() 方法, 然后 B 和 C 派生自 A, 并且有自己的 foo() 实现,现在 D 类使用多个继承派生自 B 和C,如果我们只引用 foo(), 编译器将无法决定它应该调用哪个 foo()。这也称为 Diamond 问题,因为这个继承方案的结构类似于菱形,见下图:

Java面试题支招-为什么Java语言不支持多继承_构造方法_02

即使我们删除钻石的顶部 A 类并允许多重继承,我们也将看到这个问题含糊性的一面。如果你把这个理由告诉面试官,他会问为什么 C++ 可以支持多重继承而 Java不行。嗯,在这种情况下,我会试着向他解释我下面给出的第二个原因,它不是因为技术难度, 而是使得程序代码具有更好的可维护和更清晰的设计, 虽然这只能由 Java 言语设计师确认,我们只是推测。

2、第二个也是更有说服力的理由是,多重继承确实使设计变得复杂化。例如在创建子类对象时,会先调用父类的构造方法,再调用子类的构造方法,参见:探秘子类调用父类的构造方法的方式

在多继承情况下,构造方法的调用顺序会变得很复杂。假设你需要多重继承的情况并不多,简单起见,明智的决定是省略它。

3、如果一个类A已经继承了类B,类A还需要继承类C,该怎么办呢?Java提倡用组合来替代继承。在类A中包装一个类C的实例,就能访问类C的功能了。示范代码如下:

public A extends B{
  C c;  // 类A中包装类C的实例

  public A(C c){this.c=c;}

  public void test(){
    c.doSome();  // 使用类C的功能
  }
}

上文参考孙卫琴的经典Java书籍。

Java面试题支招-为什么Java语言不支持多继承_Java_03

标签:面试题,调用,Java,构造方法,继承,子类,支招,foo
From: https://blog.51cto.com/sunweiqin/7871420

相关文章

  • 趣味解释Java虚拟机是啥玩意
    下文通过生动形象的例子,帮助小伙伴们轻轻松松地理解Java虚拟机的基本作用。大力:“为什么说Java语言是一种高级编程语言呢?”卫琴:“之所以称Java为高级语言,是因为它和人类的语言有一点点相近。比如用Employee类表示员工,用name属性表示员工的姓名,用selfIntro()方法模拟员工的自我介绍......
  • java——redis随笔——实战——商户查询缓存
                      把key做了下代码优化: /***根据id查询商铺信息*@paramid商铺id*@return商铺详情数据*/@OverridepublicResultqueryById(Longid){//key要唯......
  • java项目实践-webapp-mytomcat-day16
    目录1.http协议2.自定义的web框架3.具体实现4.启动1.http协议CS架构建立连接“三次握手”断开连接“四次挥手”三次握手:client:可以与你建立连接吗?server:可以的client:我也可以了四次挥手:client:我要断开server:可以断开server:我要断开client:可以断开双方都有......
  • java学习笔记day03
    java学习笔记day03数据类型public class 数据类型 {  public static void main(String[] args){    //整数类型    byte num1 = 10;    short num2 = 200;    int num3 = 3000;    long num4 = 400000L;    ......
  • JavaWeb-Maven的应用
    目录1.MavenPOM2.pom.xml内容MavenPOMPOM(ProjectObjectModel,项目对象模型)是Maven工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用于描述项目如何构建,声明项目依赖,等等。执行任务或目标时,Maven会在当前目录中查找POM。它读取POM,获取所需的配置信息,然......
  • 从零开发一款图片编辑器(使用html5+javascript)
    最近开发了一个图片编辑器,类似于photoshop的网页版,源码参考自GitHub上,顺便也总结下使用html+js开发一个编辑器需要用到哪些知识点。预览地址:https://ps.gitapp.cngithub地址:https://github.com/photopea/photopea架构设计选型:jquery.js和blueimp-canvas.js都是强大的......
  • JAVA大文件(10G以上)的上传下载实现技术
    在现代互联网应用中,经常需要上传和下载大文件,如视频、音频、数据库备份等等。对于Java开发者来说,处理大文件上传下载是一个非常常见的需求。然而,由于Java内存限制和网络传输速度的限制,处理大文件上传下载需要一些特殊的技术。本文将介绍一种基于流的方式来实现Java大文件的上传和......
  • 深入理解 JavaScript 时间分片:原理、应用与代码示例解析
    JavaScript时间分片(TimeSlicing)是一种优化技术,用于将长时间运行的任务拆分为多个小任务,以避免阻塞主线程,提高页面的响应性和性能。本文将详细解释JavaScript时间分片的原理、应用场景,并通过代码示例帮助读者更好地理解和应用该技术。本文首发于:kelen.cc概念时间分片(TimeSl......
  • Javascript、axios、vue基础命令快速学习
    1.js:JavaScript基础学习JavaScript基础学习简单案例1.点击img1,则展示img1图片默认,点击img2则展示img2图片2.输入框鼠标聚焦onfocus后,显示小写toLowerCase(),失去焦点onblur后显示大写toUpperCase()3.点击全选按钮,所有复选框为被选中状态,点击反选则取消勾选状态JavaScrip......
  • 前端面试题之CSS
    一、CSS基础1.对盒模型的理解CSS3中的盒模型有以下两种:标准盒子模型、IE盒子模型盒模型都是由四个部分组成的,分别是margin、border、padding和content。标准盒模型和IE盒模型的区别在于设置width和height时,所对应的范围不同:标准盒模型的width和height属性的范围只包含了content,IE盒......