很久以前,博主的一个好朋友给我考了我一个问题,为什么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. Java利用TCP编程实现简单聊天室

    前言: 本文是我在学习尚学堂JAVA300集第二季网络编程部分仿照视频内容实现而成 具体可以去尚学堂官网观看视频学习 一.实现思路 实现聊天室的最核心部分就是JAVA的TCP网络编程. TCP 传输控 ...

  2. Docker Swarm Mode 学习笔记(聊聊 replicas)

    在 Swarm 集群中, 创建服务时可以通过设置 --replicas 参数来指定此服务在工作节点上运行的任务数. 示例 这里我们来创建一个 nginx 服务作为示例: version: '3' se ...

  3. 使用卷积神经网络CNN完成验证码识别

    gen_sample_by_captcha.py 生成验证码图片 # -*- coding: UTF-8 -*- """ 使用captcha lib生成验证码(前提:pi ...

  4. thinkphp3.2升级至thinkphp5.0.24

    view文件 修改文件名 把tp3.2.3\app\module\view文件夹下所有文件夹拷贝至tp5\app\module\view 打开cmd命令窗口,cd至view文件夹下,执行dir /b ...

  5. openstack-ntp时间同步服务

    ntp时钟同步服务 NTP 工作请求 (1) 客户端将采用随机端口向 NTP 服务器 (UDP:123) 发出时间同步请求 (2)NTP 服务器收到请求后会将发出调校时间 (3)NTP 客户端接收到 ...

  6. 哆啦A梦css

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. 自定义Cordova插件(基础篇)

    cordova自定义插件 注意:存放自定义cordova插件目录不能有空格可能会报错 cordova的安装 下载node.js,安装完成后你可以在命令行中使用node和npm. 安装cordova使用 ...

  8. APP多开教程

    https://bbs.feng.com/read-htm-tid-11793134.html 本教程原创,送给有需要的人.本人就为了多开百度云盘传数据,故多开两个百度云盘,亲测一周多没毛病.微信多开 ...

  9. 【XAF问题】层层分级,如何让按钮显示指定的视图

    一.问题 1. 层层分级,如何让按钮显示指定的视图 二.解决方法 解决方法:因为它是层层级别的,不能显示出来指定的视图,需要添加ActionContainer,才可以显示出来

  10. BUAAOO-Second-Summary

    #目录 homework & class & trainning : 两次上机.三次作业.四周课堂 code analysis & review : 为什么我没有bug,为什么 ...