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

news2024/9/20 18:28:31

一、菱形继承的概念

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

例如: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");
    }

    @Override
    public 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.coloradmin.cn/o/1702752.html

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

相关文章

输出相关命令

什么是输入输出重定向,就是用另外一个位置来代替它,默认输入为键盘,默认输出为终端窗口 管道能把一系列的命令连起来,|为命令符 cat file 历史查询 history 回车可以查到用过的命令。上下左右键可以回到之前命令或…

深入理解深度学习中的激活层:Sigmoid和Softmax作为非终结层的应用

深入理解深度学习中的激活层:Sigmoid和Softmax作为非终结层的应用Sigmoid 和 Softmax 激活函数简介Sigmoid函数Softmax函数 Sigmoid 和 Softmax 作为非终结层多任务学习特征变换增加网络的非线性实际案例 注意事项结论 深入理解深度学习中的激活层:Sigmo…

【算法专题】双指针算法之 移动零

欢迎来到CILMY23的博客 🏆本篇主题为:双指针算法之移动零 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux 🏆感谢观看,支持的…

这3个AI自动生成绘画软件太好用啦!画画人必看

AI自动生成绘画软件正在成为艺术创作领域的一股新潮流,它们以其强大的功能和用户友好的设计,为艺术家们带来了前所未有的便利和创意空间。今天,我们将一起探索5款备受好评的AI自动生成绘画软件,它们不仅功能全面,而且操…

黎加厚教授:生成式人工智能对课程教材教法的影响

01 生成式人工智能与过去的信息技术有哪些不一样的地方 2023年,生成式人工智能(GenAI)犹如百年惊雷,改变了我对计算机的认识。最先让我折服的是AI绘画,我只需要把心中想象的场景用提示词详细描述,立刻就生…

Ubuntu执行命令出现乱码,菱形符号

1、问题描述 如题,Ubuntu执行命令出现乱码,菱形符号(见下图): 2、解决办法 export LC_ALLC 再运行就好了

comfyui电商场景工作流总结

eSheep(内测中) - 一站式的AIGC社区eSheep.com 是国内知名的AIGC在线画图网站,提供海量模型,并支持在线AI画图。用户会上传自己的AIGC作品到网站上,进行交流。eSheep让AIGC更轻松,让更多人在AIGC中找到快乐https://www.esheep.com/apphttps://openart.ai/workflows/all

RTSP/Onvif安防视频监控云平台EasyNVR重启后通道在线视频无法播放,接口报错502是什么原因?

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力,能对接入的视频流进行处理与多端分发,包括RTSP、RTMP、HTTP-FLV、W…

内存泄漏案例分享1—Activity或Fragment的内存泄漏

背景 笔者优化音乐App内存泄漏时候,遇到了3个典型内存泄漏,泄漏的内存为39kb,一次39KB看上去不多,积少成多很有可能导致OOM,值得重视。 PS:文末有优化方案,优化后内存减少至原先的150分之一。 …

电子画册制作技巧,从零基础到专业人士

电子画册作为一种新兴的视觉传达形式,正越来越受到大众的喜爱。从设计新手到专业人士,如何快速掌握电子画册的制作技巧,提升自己的创作水平呢? 一、明确设计目的和定位 制作电子画册前,首先要明确其设计目的和定位。画…

【编译原理】LR(0)分析

一、实验目的 LR(0)分析法是一种移进归约过程,能根据当前分析栈中的符号串,同时也不用向右查看输入串的符号就可唯一确定分析器的动作。通过对给定的文法构造LR(0)分析表和实现某个符号串的分析掌握LR(0)分析法的基本思想。 二、实验要求 实现LR(0)分…

推荐3款好用的AI智能写作工具

AI智能写作如今已经很成熟了,不仅有很多AI综合大模型可以实现AI写作,还有很多专门针对AI写作场景专门研发的垂直领域工具。 如果你在工作学习中也想提高写作效率,不妨试试下面3个国内可直接登录使用的AI写作工具,其中不乏有简单易…

【Java】IdentityHashMap 的使用场景

文章目录 前言1. Druid 应用场景2. IdentityHashMap 特性3. IdentityHashMap 同步化4. IdentityHashMap 处理key为空值后记 前言 最近有兴趣看一下 Druid 连接池怎么做连接管理的,看到一个类 IdentityHashMap ,这里记录一下使用场景。 1. Druid 应用场…

民国漫画杂志《时代漫画》第26期.PDF

时代漫画26.PDF: https://url03.ctfile.com/f/1779803-1248635183-9832d2?p9586 (访问密码: 9586) 《时代漫画》的杂志在1934年诞生了,截止1937年6月战争来临被迫停刊共发行了39期。 ps: 资源来源网络!

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(十二)

课程地址: 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程,一套精通鸿蒙应用开发 (本篇笔记对应课程第 19节) P19《18.ArkUI组件-页面路由》 以访问京东页面为例,访问过的页面并没有消失,而是进入了…

[图解]企业应用架构模式2024新译本讲解01-事务脚本

1 00:00:00,220 --> 00:00:03,010 接下来,我们就要进入模式的讲解了 2 00:00:04,030 --> 00:00:05,940 这个是书里面的目录 3 00:00:06,230 --> 00:00:08,140 按照 4 00:00:08,150 --> 00:00:09,220 领域逻辑模式 5 00:00:09,230 --> 00:00:10,5…

一点点 cv 经验 1:cv方向、模型评估、输入尺寸、目标检测器设计

一点点 cv 经验 1:cv方向、模型评估、输入尺寸、目标检测器设计 cv 方向Pytorch数据集划分 模型评估误差偏差方差噪声 输入尺寸方法一:让数据适应模型方法二:修改模型适应数据方法三:划分Patch,分别处理 目标检测器结构…

探索演进:了解IPv4和IPv6之间的区别

探索演进:了解IPv4和IPv6之间的区别 在广阔的互联网领域中,设备之间的通信依赖于一组独特的协议来促进连接。前景协议中,IPv4(Internet 协议版本 4)和 IPv6(Internet 协议版本 6)是数字基础设施…

二、OpenWebUI 使用(.Net8+SemanticKernel+Ollama)

OpenWebUI的github上安装部署已经很详细,直接照着敲命令即可 GitHub:https://github.com/open-webui/open-webui 一、使用配置 1、访问:http://Ip:3000,打开如下OpenWebUI界面。 2、先点击“注册”,注册一个管理员帐号…

从普通神经网络到transformer

1.单隐藏层的多层感知机 2. 循环神经网络 3.现代循环神经网络。 GRU 门控循环单元 LSTM 长短期记忆网络 候选记忆元: ˜C t ∈ R (nh) 记忆元