面試官:為什么 Java 不支持類多重繼承?一下被問懵了!
點(diǎn)下面 ↓↓↓ 小程序刷題進(jìn)大廠
我發(fā)現(xiàn)這個(gè)問題很難回答,因?yàn)榇鸢缚赡懿粫?huì)讓面試官滿意,在大多數(shù)情況下,面試官正在尋找答案中的關(guān)鍵點(diǎn),如果你提到這些關(guān)鍵點(diǎn),面試官會(huì)很高興。
在 Java 中回答這種棘手問題的關(guān)鍵是準(zhǔn)備好相關(guān)主題, 以應(yīng)對(duì)后續(xù)的各種可能的問題。
這是非常經(jīng)典的問題,與為什么 String 在 Java 中是不可變的很類似; 這兩個(gè)問題之間的相似之處在于它們主要是由 Java 創(chuàng)作者的設(shè)計(jì)決策使然。
為什么 Java 不支持類多重繼承, 可以考慮以下兩點(diǎn):
1、 第一個(gè)原因圍繞鉆石??形繼承問題產(chǎn)生的歧義
考慮一個(gè)類 A 有 foo() 方法, 然后 B 和 C 派生自 A, 并且有自己的 foo() 實(shí)現(xiàn),現(xiàn)在 D 類使用多個(gè)繼承派生自 B 和 C。
如果我們只引用 foo(), 編譯器將無(wú)法決定它應(yīng)該調(diào)用哪個(gè) foo(),這也稱為 Diamond 問題,因?yàn)檫@個(gè)繼承方案的結(jié)構(gòu)類似于菱形,見下圖:
A foo()
/ \
/ \
foo() B C foo()
\ /
\ /
D foo()
即使我們刪除鉆石的頂部 A 類并允許多重繼承,我們也將看到這個(gè)問題含糊性的一面。如果你把這個(gè)理由告訴面試官,他會(huì)問為什么 C++ 可以支持多重繼承而 Java不行。
嗯,在這種情況下,我會(huì)試著向他解釋我下面給出的第二個(gè)原因,它不是因?yàn)榧夹g(shù)難度, 而是更多的可維護(hù)和更清晰的設(shè)計(jì)是驅(qū)動(dòng)因素, 雖然這只能由 Java 言語(yǔ)設(shè)計(jì)師確認(rèn),我們只是推測(cè)。
維基百科鏈接有一些很好的解釋,說明在使用多重繼承時(shí),由于鉆石問題,不同的語(yǔ)言地址問題是如何產(chǎn)生的。
2、對(duì)我來(lái)說第二個(gè)也是更有說服力的理由是,多重繼承確實(shí)使設(shè)計(jì)復(fù)雜化并在強(qiáng)制轉(zhuǎn)換、構(gòu)造函數(shù)鏈接等過程中產(chǎn)生問題。
假設(shè)你需要多重繼承的情況并不多,簡(jiǎn)單起見,明智的決定是省略它。
此外,Java 可以通過使用接口支持多繼承來(lái)避免這種歧義。由于接口只有方法聲明而且沒有提供任何實(shí)現(xiàn),因此只有一個(gè)特定方法的實(shí)現(xiàn),因此不會(huì)有任何歧義。
作者:Yujiaao
https://segmentfault.com/a/1190000019962661
課程推薦
Spring 6 和 Spring Boot 3.0 都要求最低 JDK 17+,必須盡早學(xué)習(xí)了,棧長(zhǎng)制作了《 Java 17 新特性實(shí)戰(zhàn)課 》,不管是新特性、還是性能,JDK 17 都是一個(gè)里程碑式的提升。 課程非常全面,幾乎覆蓋了 JDK 9 ~ 17 所有核心知識(shí)點(diǎn),市面上幾乎沒有, 已全部完結(jié),可隨時(shí)報(bào)名學(xué)習(xí)全部?jī)?nèi)容。對(duì) JDK 17 感興趣的掃碼報(bào)名學(xué)習(xí):
?? 課程詳細(xì)介紹: Java 17 新特性實(shí)戰(zhàn)課
課程原價(jià) 199 元,現(xiàn)在剛上市半價(jià) 99 元即可上車,想學(xué)習(xí)全新 Java 技術(shù)的盡快上車,不管是用來(lái)面試跳槽,還是工作所需,都是相當(dāng)有必要的。
