作者:Yujiaao
https://segmentfault.com/a/1190000019962661
我發現這個問題很難回答,因為答案可能不會讓面試官滿意,在大多數情況下,面試官正在尋找答案中的關鍵點,如果你提到這些關鍵點,面試官會很高興,
在 Java 中回答這種棘手問題的關鍵是準備好相關主題, 以應對后續的各種可能的問題,
這是非常經典的問題,與為什么 String 在 Java 中是不可變的很類似; 這兩個問題之間的相似之處在于它們主要是由 Java 創作者的設計決策使然,
為什么Java不支持類多重繼承, 可以考慮以下兩點:
1、 第一個原因圍繞鉆石??形繼承問題產生的歧義
考慮一個類 A 有 foo() 方法, 然后 B 和 C 派生自 A, 并且有自己的 foo() 實作,現在 D 類使用多個繼承派生自 B 和 C,
如果我們只參考 foo(), 編譯器將無法決定它應該呼叫哪個 foo(),這也稱為 Diamond 問題,因為這個繼承方案的結構類似于菱形,見下圖:
A foo()
/ \
/ \
foo() B C foo()
\ /
\ /
D foo()
即使我們洗掉鉆石的頂部 A 類并允許多重繼承,我們也將看到這個問題含糊性的一面,如果你把這個理由告訴面試官,他會問為什么 C++ 可以支持多重繼承而 Java不行,
嗯,在這種情況下,我會試著向他解釋我下面給出的第二個原因,它不是因為技術難度, 而是更多的可維護和更清晰的設計是驅動因素, 雖然這只能由 Java 言語設計師確認,我們只是推測,
維基百科鏈接有一些很好的解釋,說明在使用多重繼承時,由于鉆石問題,不同的語言地址問題是如何產生的,
2、對我來說第二個也是更有說服力的理由是,多重繼承確實使設計復雜化并在強制轉換、建構式鏈接等程序中產生問題,
假設你需要多重繼承的情況并不多,簡單起見,明智的決定是省略它,
此外,Java 可以通過使用介面支持多繼承來避免這種歧義,由于介面只有方法宣告而且沒有提供任何實作,因此只有一個特定方法的實作,因此不會有任何歧義,
關注公眾號Java技術堆疊回復"面試"獲取我整理的2020最全面試題及答案,
推薦去我的博客閱讀更多:
1.Java JVM、集合、多執行緒、新特性系列教程
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
4.Java、后端、架構、阿里巴巴等大廠最新面試題
覺得不錯,別忘了點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/152920.html
標籤:Java
