《淺析:java不支持多繼承的原因》
很久以前,博主的一個好朋友給我考了我一個問題,為什麽Java不支持多繼承,如果多繼承會有什麽錯誤。這個問題困擾了我很久,我從單繼承方面去推導過,又從多態的層面去思考過,但都無法解釋為什麽Java不支持多繼承的原因,後來也有在學校問老師,老師也只是讓我多去思考,好吧,那我就多去思考吧。
在1995年,Java語言的設計者James Gosling發表白皮書的時候談到了一個想法:Java為什麽不支持多繼承。
我們從設計人員給Java這門語言的定義去說起:JAVA:一個簡單的,面向對象的,分布式的,解釋型的,健壯的,安全的,體系結構中立的,可移植,高性能,多線程的,動態的語言。相比於其他的程序語言例如C++ 來說,Java省去了不少令人頭疼的東西,比如說指針,多重繼承。這的確給Java程序員帶來了切身的感受:這門語言更加簡單了。
我們重新回歸這個問題:Java為什麽不支持多繼承。現在我用圖示來為大家進行解釋:
如上圖所示,我們有兩個類B和C繼承自A.假設B和C都重寫繼承的方法,他們提供自己的實現。現在B和C從D繼承多重繼承。D應該繼承,重寫的方法,將用於重寫的方法嗎?它從B或C?在這裏,我們有歧義。在C++中我們可能會掉入這個陷阱,但是它同樣有自己的機制去解決這個問題,但是Java就不需要考慮這個問題,因為Java沒有多重繼承,所以菱形繼承的問題問題永遠不會困擾我們(或許當時Java設計者為了避免菱形繼承的問題故意省去菱形繼承處理機制也不一定)。
從我們接觸Java這門語言開始,這門語言就被與其他語言進行比較,多繼承問題也被認為是Java與其他語言相比的短板之一,作為補充,Java增加了接口的多實現功能。或許我們的Java還將因為多繼承的問題一直被質疑下去,但是省略了多繼承真的是一個缺陷嗎?或許這也是Java語言被更多人認可的優點之一呢!
《淺析:java不支持多繼承的原因》