广告
返回顶部
首页 > 资讯 > 精选 >为什么Java不支持多继承
  • 700
分享到

为什么Java不支持多继承

2023-06-15 16:06:05 700人浏览 泡泡鱼
摘要

这篇文章主要介绍“为什么Java不支持多继承”,在日常操作中,相信很多人在为什么Java不支持多继承问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”为什么Java不支持多继承”的疑惑有所帮助!接下来,请跟着小编

这篇文章主要介绍“为什么Java不支持多继承”,在日常操作中,相信很多人在为什么Java不支持多继承问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”为什么Java不支持多继承”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

继承

面向对象编程语言有三个重要的基本特性:封装、继承和多态。而很多人认为继承是Java面向对象编程技术的一块基石。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。

加入,我们已经定义了一个Car类,这个Car中包含了轮胎、发动机、底盘、方向盘等属性,还具有行走、加油、开窗等行为。

而如果我们想要定义一辆Bus,想要复用这些属性和行为,就可以通过继承来实现。

通过使用继承,我们使得Bus类和Car类之间存在了一定的关系,而我们通常称呼Car是Bus的父类,Bus是Car的子类。

在Java中,使用extends关键字来实现继承。

如上面Car与Bus,当写继承语句时,class Bus extends Car{ } 其中Bus类是子类,Car类是父类。

为什么Java不支持多继承

为什么Java不支持多继承

为什么Java不支持多继承

多继承

上面我们提到的Bus和Car之间的关系其实是一种单继承,指的是一个类只继承自一个父类。

软件开发中,还有一种多继承(多重继承)的情况,顾名思义,就是一个类同时继承自多个父类。

比如维基百科中关于多继承举了一个例子:

例如,可以创造一个“哺乳类动物”类别,拥有进食、繁殖等的功能;然后定义一个子类型“猫”,它可以从父类继承上述功能,不需重新编写程序,同时增加属于自己的新功能,例如“追赶老鼠”。

但是,"猫"还可以作为"宠物"的子类,拥有一些宠物独有的能力。

作为面向对象语言,c++是支持多重继承的。

但是,多年以来,多重继承一直都是一个敏感的话题,反对者指它增加了程序的复杂性与含糊性。

为什么Java不支持多继承

为什么Java不支持多继承

为什么Java不支持多继承

Java不支持多继承

很多人知道,Java是不支持多重继承的,这里要提一下,这里的继承特指的是使用extends关键字的这种继承行为。

那么为什么Java不支持多重继承呢?

关于这个问题,Java的创始人James Gosling曾经回答过,他表示:

"Java之所以不支持一个类继承多个类,主要是因为在设计之初我们听取了来自C++和Objective-C登阵营的人的意见。因为多继承会产生很多歧义问题。"

Gosling老人家提到的歧义问题,其实是C++因为支持多继承之后带来的菱形继承问题。

假设我们有类B和类C,它们都继承了相同的类A。另外我们还有类D,类D通过多重继承机制继承了类B和类C。

为什么Java不支持多继承

这时候,因为D同时继承了B和C,并且B和C又同时继承了A,那么,D中就会因为多重继承,继承到两份来自A中的属性和方法。

这时候,在使用D的时候,如果想要调用一个定义在A中的方法时,就会出现歧义。

因为这样的继承关系的形状类似于菱形,因此这个问题被形象地称为菱形继承问题。

而C++为了解决菱形继承问题,又引入了虚继承。

因为支持多继承,引入了菱形继承问题,又因为要解决菱形继承问题,引入了虚继承。而经过分析,人们发现我们其实真正想要使用多继承的情况并不多。

所以,在 Java 中,不允许“实现多继承”,即一个类不允许继承多个父类。但是 Java  允许“声明多继承”,即一个类可以实现多个接口,一个接口也可以继承多个父接口。由于接口只允许有方法声明而不允许有方法实现(Java 8之前),这就避免了 C++  中多继承的歧义问题。

为什么Java不支持多继承

为什么Java不支持多继承

为什么Java不支持多继承

为什么Java不支持多继承

为什么Java不支持多继承

Java 8支持多继承

Java不支持多继承,但是是支持多实现的,也就是说,同一个类可以同时实现多个类。

我们知道,在Java  8以前,接口中是不能有方法的实现的。所以一个类同时实现多个接口的话,也不会出现C++中的歧义问题。因为所有方法都没有方法体,真正的实现还是在子类中的。

那么问题来了。

Java 8中支持了默认函数(default method ),即接口中可以定义一个有方法体的方法了。

public interface Pet {      public default void eat(){         System.out.println("Pet Is Eating");     } }

而又因为Java支持同时实现多个接口,这就相当于通过implements就可以从多个接口中继承到多个方法了,这不就是变相支持了多继承么。

那么,Java是怎么解决菱形继承问题的呢?我们再定义一个哺乳动物接口,也定义一个eat方法。

public interface Mammal {      public default void eat(){         System.out.println("Mammal Is Eating");     } }

然后定义一个Cat,让他分别实现两个接口:

public class Cat implements Pet,Mammal {  }

这时候,编译期会报错:

error: class Cat inherits unrelated defaults for eat() from types Mammal and Pet

这时候,就要求Cat类中,必须重写eat()方法。

public class Cat implements Pet,Mammal {     @Override     public void eat() {         System.out.println("Cat Is Eating");     } }

所以可以看到,Java并没有帮我们解决多继承的歧义问题,而是把这个问题留给开发人员,通过重写方法的方式自己解决。

到此,关于“为什么Java不支持多继承”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: 为什么Java不支持多继承

本文链接: https://www.lsjlt.com/news/280926.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 为什么Java不支持多继承
    这篇文章主要介绍“为什么Java不支持多继承”,在日常操作中,相信很多人在为什么Java不支持多继承问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”为什么Java不支持多继承”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-15
  • Java不支持多继承的原因是什么
    这篇文章主要介绍“Java不支持多继承的原因是什么”,在日常操作中,相信很多人在Java不支持多继承的原因是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java不支持多继承的原因是什么”的疑惑有所帮助!...
    99+
    2023-07-05
  • Java中继承多数为什么是有害的
    这篇文章主要介绍“Java中继承多数为什么是有害的”,在日常操作中,相信很多人在Java中继承多数为什么是有害的问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中继承多数为什么是有害的”的疑惑有所帮助!...
    99+
    2023-06-03
  • 为什么nodejs不支持import
    这篇文章主要讲解了“为什么nodejs不支持import”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“为什么nodejs不支持import”吧! ...
    99+
    2022-10-19
  • 聊聊Java的switch为什么不支持long
    目录Java为什么不浪(long)疑问分析编程思想汇总switch能否作用于Long,string上Java为什么不浪(long) 学而时习之不亦说乎,继续温习Java。 今天使用s...
    99+
    2022-11-12
  • PHP为什么不支持多线程?怎么克服?
    PHP是一门非常流行的脚本语言,它可以用来开发各种类型的Web应用程序。然而,与其它编程语言相比,PHP似乎有一个缺点,那就是它不支持多线程。这一限制可能会使人们怀疑PHP的性能和可扩展性。本文将探讨PHP不支持多线程的原因,并讨论在开发W...
    99+
    2023-05-14
    php
  • mongodb为什么不支持事务
    MongoDB不支持事务的主要原因是为了追求高性能和可伸缩性。事务需要锁定数据,并保证数据的一致性,这会限制并发性能和增加系统的复杂...
    99+
    2023-09-04
    mongodb
  • 微软为什么不支持php8
    微软不支持php8的原因:1、战略调整;2、市场竞争;3、技术兼容性;4、社区反馈;5、资源分配;6、技术风险;7、生态系统的考虑;8、法律和授权问题。详细介绍:1、战略调整,微软可能认为PHP在其整体战略中的地位较低,因此没有将PHP8的...
    99+
    2023-12-21
    微软 PHP8
  • 浅谈Java为什么只能单继承
    目录先屡清楚继承和实现的区别:分析原因:多继承虽然能使子类同时拥有多个父类的特征,但是其缺点也是很显著的,主要有两方面: (1)如果在一个子类继承的多个父类中拥有相同名字的实例变量,...
    99+
    2023-03-15
    Java 单继承
  • Python为什么不支持switch语句
    一、简洁性和可读性 Python的设计哲学之一是代码的简洁性和可读性。引入”switch”语句可能会增加语言的复杂性,并且可以用其他方式更清晰地表达相同的逻辑。Python鼓励使用”if-elif-else”语句来处理多个条件情况,这种方式...
    99+
    2023-10-29
    不支持 语句 Python
  • 为什么Python不支持i ++语法
    本篇内容介绍了“为什么Python不支持i ++语法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!正常情况下,当有人问起++原因而不是Pyt...
    99+
    2023-06-16
  • input为什么不支持伪元素
    input 元素是 HTML 表单中的一个表单控件,用于接收用户的输入。它是一个自闭合标签,没有内容,因此不支持伪元素。伪元素是用于在 CSS 中选择和样式化元素的特殊选择器,例如 `::before` 和 `::after`。伪元素可以用...
    99+
    2023-10-21
    input 伪元素
  • java不能被继承的类是什么类
    JAVA中被 final 标志的类,是最终类,不可以被继承,如:public 、final 、String。JAVA继承的介绍:继承是面向对象最显著的一个特性,继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的...
    99+
    2016-10-22
    java
  • 为什么redis支持多个数据库
    为什么redis支持多个数据库?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。注意:Redis支持多个数据库,并且每个数据库的数据是隔离的不...
    99+
    2022-10-18
  • 为什么GO不支持循环引用
    目录1、案例演示2、原因分析3、总结学习 Go 语言的开发者越来越多了,很多小伙伴在使用时,就会遇到种种不理解的问题。 其中一点就是包的循环引用的报错: package comm...
    99+
    2022-11-12
  • MySQL为什么不支持中文排序?
    前言 或许都知道,MySQL不支持中文排序,这样的说法可以说对也可以说也不对。接下来我们分析一下: 首先执行命令,查看编码集: SHOW VARIABLES LIKE "character_set%"; 可以看到字符集是utf8mb4,...
    99+
    2020-10-28
    MySQL为什么不支持中文排序?
  • python为什么不支持函数重载
    python中不支持函数重载的原因函数重载主要是为了解决可变参数类型和可变参数个数两个问题。而python中可以接受任何类型的参数,如果函数的功能相同,那么不同的参数类型在 python 中很可能是相同的代码,没有必要做成两个不同函数,从而...
    99+
    2022-10-06
  • Redis事务为什么不支持回滚
    目录前言Redis 有事务吗Redis 事务实现原理Redis 事务 ACID 特性A - 原子性 C - 一致性I - 隔离性D - 持久性watch 命令watch 命...
    99+
    2022-11-12
  • Kafka为什么不支持读写分离
    本篇文章为大家展示了Kafka为什么不支持读写分离,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。在 Kafka 中,生产者写入消息、消费者读取消息的操作都是与 leader 副本进行交互的,从 而实...
    99+
    2023-06-16
  • 为什么说php不支持unicode编码
    本篇内容介绍了“为什么说php不支持unicode编码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php不支持unicode是指PHP字符...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作