歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

為什麼Java不支持多繼承

最近我的一個朋友進行了幾次面試,碰到了一個很容易被問的問題:為什麼Java不支持多重繼承,盡管他回答Java可以通過實現多個interface的方式實現多重繼承,但面試官卻依然為什麼不支持。也許我的朋友僅僅是閱讀了一些相關的博客,因此他過來把這個經典的問題拋給我,類似為什麼Java中的String是不可變的常量一樣,也許這樣做是Java創造者設計決定的。然而我覺得至少以下兩個原因是有意義的:

1)避免diamond problem(菱形問題),假設class A有一個foo()方法,class B和Class C都繼承了A並實現了foo()方法,Class D 同時繼承了Class B、Class C,如果在D中調用foo()方法,那哪個會被調用呢?這個被稱為diamond problem,因為這種繼承結構與四個邊的菱形類似,

 A foo()

          / \

          /  \

 B foo()  C foo()

          \  /

          \ /

            D foo()

  我認為即使把頂部的class A去掉在D中調用foo()時依然有這樣的歧義。

也許有時你還會被問為什麼C++支持multiple inheritance而Java卻不行,這時我會向他解釋下面的第二個原因,這不是技術原因,而是從程序的可維護、可讀行上考慮的,然而這只是我個人推測,只有Java設計者才能確認這個原因。Wikipedia  上有各種語言應對diamond problem引起問題的解決方式。

2)第二個更能說服我的原因是多重繼承復雜化了設計並在類型轉換、構造上帶來了更多的問題,並且也沒有很多必須使用多重繼承的場景,因此為了簡單化而不使用多重繼承是明智的。為了避免歧義,Java使用interface實現了single inheritance,interface只提供了方法的聲明而沒有方法的實現,因此在子類中只有一個方法的實現也就不會產生歧義了。

 

Java 9 的新特性發布 http://www.linuxidc.com/Linux/2014-08/105707.htm

Java編程思想(第4版) 中文清晰PDF完整版 http://www.linuxidc.com/Linux/2014-08/105403.htm

編寫高質量代碼 改善Java程序的151個建議 PDF高清完整版 http://www.linuxidc.com/Linux/2014-06/103388.htm

Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm

Java對象初始化順序的簡單驗證 http://www.linuxidc.com/Linux/2014-02/96220.htm

Java對象值傳遞和對象傳遞的總結 http://www.linuxidc.com/Linux/2012-12/76692.htm

Copyright © Linux教程網 All Rights Reserved