很久以前,博主的一个好朋友给我考了我一个问题,为什么Java不支持多继承,如果多继承会有什么错误。这个问题困扰了我很久,我从单继承方面去推导过,又从多态的层面去思考过,但都无法解释为什么Java不支持多继承的原因,后来也有在学校问老师,老师也只是让我多去思考,好吧,那我就多去思考吧。

  在1995年,Java语言的设计者James Gosling发表白皮书的时候谈到了一个想法:Java为什么不支持多继承。

我们从设计人员给Java这门语言的定义去说起:JAVA:一个简单的,面向对象的,分布式的,解释型的,健壮的,安全的,体系结构中立的,可移植,高性能,多线程的,动态的语言。相比于其他的程序语言例如C++ 来说,Java省去了不少令人头疼的东西,比如说指针,多重继承。这的确给Java程序员带来了切身的感受:这门语言更加简单了。

我们重新回归这个问题:Java为什么不支持多继承。现在我用图示来为大家进行解释:

  

  如上图所示,我们有两个类B和C继承自A.假设B和C都重写继承的方法,他们提供自己的实现。现在B和C从D继承多重继承。D应该继承,重写的方法,将用于重写的方法吗?它从B或C?在这里,我们有歧义。在C++中我们可能会掉入这个陷阱,但是它同样有自己的机制去解决这个问题,但是Java就不需要考虑这个问题,因为Java没有多重继承,所以菱形继承的问题问题永远不会困扰我们(或许当时Java设计者为了避免菱形继承的问题故意省去菱形继承处理机制也不一定)。

  从我们接触Java这门语言开始,这门语言就被与其他语言进行比较,多继承问题也被认为是Java与其他语言相比的短板之一,作为补充,Java增加了接口的多实现功能。或许我们的Java还将因为多继承的问题一直被质疑下去,但是省略了多继承真的是一个缺陷吗?或许这也是Java语言被更多人认可的优点之一呢!

《浅析:java不支持多继承的原因》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. SPOJ COT Count on a tree(树上主席树 + LCA 求点第k小)题解

    题意:n个点的树,每个点有权值,问你u~v路径第k小的点的权值是? 思路: 树上主席树就是每个点建一棵权值线段树,具体看JQ博客,LCA用倍增logn求出,具体原理看这里 树上主席树我每个点的存的是点 ...

  2. idea工具和激活码获取

    1.下载最新的idea https://blog.csdn.net/mashuai720/article/details/79389314 2.获取激活码 最后一个有效,亲测 https://blog ...

  3. SAP 应收票据处理之贴现流程和配置

    特殊总账的应收票据处理是通过特殊总账标识实现的,特殊总账标识为W.在配置特殊总账时候,可以通过下面路径,定义特殊总账标识对应的备选科目.

  4. robot framework---校验新增条数功能

    check总条数验证 [Arguments] ${beforevalue} ${endvalue} ${value} ${a} Evaluate '${beforevalue}'.replace('共 ...

  5. spark DAG 笔记

    DAG,有向无环图,Directed Acyclic Graph的缩写,常用于建模. Spark中使用DAG对RDD的关系进行建模,描述了RDD的依赖关系,这种关系也被称之为lineage,RDD的依 ...

  6. vSphere虚拟化平台升级注意事项

    关注嘉为科技,获取运维新知 一. Vmware生命周期查询 目前,绝对部分企业均使用VMware vSphere 来构建云计算基础架构,从而减少运行的服务器数量,降低资金成本和运营成本,提高业务灵活性 ...

  7. poj3162

    这题卡常数了,nlogn链式前向星过了,用vector的O(n)没过. #include <iostream> #include <cstdio> #include <c ...

  8. C(n,m)排列组合算法

    主要解决C(n,m)问题 static class Extension { public static IList<IList<T>> GetGroup<T>(th ...

  9. 使用js实现放大镜效果

    点击预览放大镜效果,图片比较大,因为需要精细的图片去凸显放大的效果,请耐心 可以通过滑轮控制放大倍数,由于图片太大 如果放大镜没有出现 可刷新一下网页

  10. 毕设记录(ajax)

    有关ajax的cache属性值 cache作用:是否在缓存中读取数据的读取. cache属性是true(默认值)时:在第一次请求完成之后,如果地址和参数不变化,第二次去请求,会默认获取缓存中的数据,不 ...