來自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.pswp.cn/bicheng/17047.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17047.shtml
英文地址,請注明出處:http://en.pswp.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 .. -…

企業網絡中的網絡故障排除

目錄 什么是網絡故障排除? 企業網絡中常見的網絡問題 網絡故障排除的步驟 1. 確認問題 2. 數據收集 3. 分析和診斷 4. 實施解決方案 5. 驗證和監控 常用的網絡故障排除工具 如何預防網絡故障 結論 在當今高度互聯的企業環境中,網絡的可靠性和…

PostgreSQL的擴展(extensions)-常用的擴展之pg_store_plans

PostgreSQL的擴展(extensions)-常用的擴展之pg_store_plans pg_store_plans 是一個 PostgreSQL 擴展,用于捕獲查詢執行計劃(execution plans)并將其存儲在數據庫中。通過存儲和分析這些執行計劃,數據庫管理…

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項目管理工具,并且結…

鎧俠KIOXIA KCD81PJE7T68 E3.S PCIe 5.0 NVMe 企業級SSD

今天介紹一下我們的新產品KCD81PJE7T68,這款企業級NVMe固態硬盤將為您的關鍵任務應用帶來出色的性能和可靠支持。 提升業務效能 提速至關鍵 在當今高度數字化的商業環境中,企業對于數據存儲系統的性能要求愈加苛刻。無論是大數據分析、人工智能訓練,還是虛擬化和聯…

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

在數字化時代,微信小程序為我們提供了許多便捷的服務,其中就包括打印功能。而琢貝云打印小程序,作為一款功能強大、操作簡便的線上打印平臺,更是受到了廣大用戶的青睞。下面,我將為大家介紹如何使用琢貝云打印小程序完…

下雨天的短視頻:成都鼎茂宏升文化傳媒公司

下雨天的短視頻:捕捉雨中的詩意與溫情 在快節奏的現代生活中,短視頻以其獨特的魅力成為了人們記錄生活、分享情感的重要工具。而下雨天,這個常常帶有詩意與溫情的場景,更是為短視頻創作者們提供了無盡的靈感源泉。成都鼎茂宏升文…

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軟件 具有通道的設備管理通 道通…