来自Java的“菱形继承“,你听说过吗?

一、菱形继承的概念

菱形继承又叫做钻石继承,指的是不同的类同时继承自相同的父类,存在一个子类同时继承这些不同的类,即我们常说的“多继承”问题。

例如:B类和C类分别继承A类,而D类同时继承B类和C类。

如此图所示

 二、代码演示

我们通过IDEA分别创建A、B、C和D类,演示存在的问题:

public class A {public void sayHi(){System.out.println("我是A");}
}public class B extends A{public void sayHi(){System.out.println("我是B");}
}public class C extends A{public void sayHi(){System.out.println("我是C");}
}public class D extends B,C{public void sayHi(){System.out.println("我是D");}
}

接下来我们创建主函数:

public class Main {public static void main(String[] args) {B b=new B();b.sayHi();C c=new C();c.sayHi();D d=new D();d.sayHi();}
}

当我们点击运行按钮,会提示该内容报错:

很显然,我们的代码不存在任何问题。IDEA认为此处有语法错误,因为Java默认不支持对多个类的继承。

三、问题分析

1. 上述的示例代码比较简单,如果业务代码的逻辑比较复杂,多继承会导致编程的难度大大提升,会增加代码的复杂度。(Java并不支持)

2. 如果可以支持多继承,那么我们需要根据上述案例思考:如果D类可以同时继承B类和C类且不进行方法的重写,当我们在主函数中进行调用D类的 sayHi() 方法时,到底该调用父类B类的方法呢,还是该调用父类C类的方法呢?这就导致我们的程序的方法的调用存在二义性的问题。

3. 如果可以支持多继承,子类同时继承多个父类,子类的子类又同时继承多个父类,以此循环往复,这不就是传说中的套娃吗?多继承会导致我们的程序存在“多继承的膨胀性‘,会增加继承层次的复杂性和混乱性。

四、我能想到的解决方案

1. 依据设计模式,我们可以实现:对其他类进行组合,复用其他类的功能

2. 继承一个类的同时实现某些接口:实现对父类的功能的增强和拓展其他功能

3. 实现多个接口:因为Java支持一个类实现多个接口,实现类似的多继承的效果

4.1 演示实现多接口

分别创建 IPlay 接口和 ISayhi 接口:

public interface IPlay {public abstract void play();
}public interface ISayhi {public abstract void sayHi();
}

修改D类的代码:

public class D implements ISayhi,IPlay{public void sayHi(){System.out.println("我是D");}@Overridepublic void play() {System.out.println("我可以玩");}
}

主函数进行调用:

public class Main {public static void main(String[] args) {B b=new B();b.sayHi();C c=new C();c.sayHi();D d=new D();d.sayHi();d.play();}
}

输出结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oladance、韶音、南卡开放式耳机选哪个?2024年主流产品硬核测评!

近期,不少朋友向我咨询关于挑选开放式耳机的建议,希望找到既适合自己又具有高品质的选项。鉴于市场上开放式耳机品牌繁多,每款产品在音质、佩戴感受及整体性能上的表现各有千秋,正确选择一款耳机成为了音乐爱好者们关注的焦点。错…

R绘图学习笔记

1、R语言绘制海岸线边界 参考: Drawing beautiful maps programmatically with R, sf and ggplot2 — Part 1: Basics 使用R绘制世界地图及纬度统计图 Drawing maps with R. A basic tutorial:https://dr2blog.hcommons.org/2020/03/23/drawing-maps-wit…

【408精华知识】指令字长、存储字长、机器字长大总结!

文章目录 一、三种字长二、三种字长之间的关系三、三种字长与部件位数之间的关系 一、三种字长 机器字长:等于字长,CPU一次能够处理的数据的位数。通常等于寄存器、ALU的位数。例子:windows 64位/32位,这里的64位和32位指的就是该…

Pycharm最新安装教程(最新更新时间2024年5月27日)

ps:本教程Pycharm安装,最新更新时间:2024年5月27日,公众号持续更新关注公众号防失联哦 Pycharm 再次更新了一个小版本。又回到老话题,2023.3.2这个版本是否还能安装,笔者也亲测了一下。还是沿用本站之前的…

Livox-SDK2 用vs2017编译

Livox-SDK2 Livox-SDK2代码去上面下载,文章中给出的是用vs2019进行编译的,生成项目时用的 > cmake .. -G "Visual Studio 16 2019" -A x64 但如果我想用vs2017进行编译,那么只需要将上面语句改为如下: cmake .. -…

Spring IOC容器与Bean管理详解

一.IOC与DI 1. 传统的开发方式区别 对象直接引用导致对象硬性关联,程序难以扩展维护 loC容器是Spring生态的地基,用于统─创建与管理对象依赖 2. Spring IOC 控制反转 loC控制反转,全称Inverse of Control,是一种设计理念 由代理人来创建与管理对象,消费者通…

请允许自己偶尔情绪不稳定

最近看网上的讨论,发现一件事:许多人都把「情绪稳定」当作一个很难得的优点,狂热地去追捧。 什么叫情绪稳定呢?大抵指这些: 遇到问题时不容易发火或沮丧,而是能立刻切换成解决问题的视角; 心情…

Windows系统使用Docker部署Focalboard团队协作工具详细流程

文章目录 前言1. 使用Docker本地部署Focalboard1.1 在Windows中安装 Docker1.2 使用Docker部署Focalboard 2. 安装Cpolar内网穿透工具3. 实现公网访问Focalboard4. 固定Focalboard公网地址 前言 本篇文章将介绍如何使用Docker本地部署Focalboard项目管理工具,并且结…

微信小程序打印功能怎么用?

在数字化时代,微信小程序为我们提供了许多便捷的服务,其中就包括打印功能。而琢贝云打印小程序,作为一款功能强大、操作简便的线上打印平台,更是受到了广大用户的青睐。下面,我将为大家介绍如何使用琢贝云打印小程序完…

下雨天的短视频:成都鼎茂宏升文化传媒公司

下雨天的短视频:捕捉雨中的诗意与温情 在快节奏的现代生活中,短视频以其独特的魅力成为了人们记录生活、分享情感的重要工具。而下雨天,这个常常带有诗意与温情的场景,更是为短视频创作者们提供了无尽的灵感源泉。成都鼎茂宏升文…

Spring常用注解(超全面)

官网:核心技术SPRINGDOC.CN 提供 Spring 官方文档的翻译服务,可以方便您快速阅读中文版官方文档。https://springdoc.cn/spring/core.html#beans-standard-annotations 1,包扫描组件标注注解 Component:泛指各种组件 Controller、…

9. C++通过epoll+fork的方式实现高性能网络服务器

epollfork 实现高性能网络服务器 一般在服务器上,CPU是多核的,上述epoll实现方式只使用了其中的一个核,造成了资源的大量浪费。因此我们可以将epoll和fork结合来实现更高性能的网络服务器。 创建子进程函数–fork( ) 要了解线程我们先来了解…

近五年营收和净利润大幅“败北”,尚品宅配今年押注扩张加盟

​ 《港湾商业观察》廖紫雯 两个月前经历过高管公开信的尚品宅配(300616.SZ),无论是2023年年报,还是今年一季报,虽然公司净利润表现尚佳,但收入端的持续承压仍然备受关注。 今年一季报,尚品宅…

Prometheus监控平台配置--监控集群资源信息

之前我们介绍的都是对单机的监控,今天介绍下用Prometheus对集群多台机器的系统资源进行监控。 我们需要在被压测服务器上安装 node_exporter和mysql_exporter,通过这两个工具对操作系统和mysql进行监控,将收集的数据存储到Prometheus&#xf…

快速版-JS基础01书写位置

1.书写位置 2.标识符 3.变量 var:声明变量。 (1).变量的重新赋值 (2).变量的提升 打印结果:console.log(变量名) 第一个是你写在里面的。 第二个是实际运行的先后之分,变量名字在最前面。变量…

Delphi 开发Android Service四种模式初探

前言: 本篇文章正经来说,其实算是我的学习履历,是我在不断的摸索过程中,总结的经验,不能算是一篇正经的学术文章。现在DELPHI的学习资料太少了,就算是有也都是基于老版本DELPHI,或VCL相关的内容…

26计算机操作系统408考研--操作系统设备管理篇章(五)

文章目录 一、设备是什么?设备管理目标和任务I/O设备分类 二、I/O系统控制方式程序直接控制方式中断控制方式DMA控制方式通道控制方式 I/O软件的组成I/O软件设计目标和原则I/O软件结构设备驱动程序设备无关软件用户层软件用户层的I/O软件 具有通道的设备管理通 道通…

Day37 代码随想录打卡|二叉树篇---对称二叉树

题目: 给你一个二叉树的根节点 root , 检查它是否轴对称。 方法:本体可以用递归和迭代两种方法,但我更喜欢迭代的方式,因此使用迭代的方式做一下。首先我们分析一下不对称的情况。因为对称的情况很简单,即两…

实现一个简单的 Google Chrome 扩展程序

目录 🧭 效果展示 # 图示效果 a. 拓展程序列表图示效果: b. 当前选项卡页面右键效果: c. 拓展程序消息提示效果: 📇 项目目录结构 # 说明 # 结构 # 文件一览 ✍ 核心代码 # manifest.json # background.j…

星融元获2024网络开源优秀创新成果奖!

5月25日,星融元受邀参加2024年第四届网络开源技术生态大会,分享主题为“开放的网络 开放的AI生态”主题演讲,深受现场用户的认可;《Easy RoCE:基于SONiC、Klish和Prometheus的极简无损网络解决方案》获得2024网络开源优…