首先我們要明確一個(gè)事實(shí),在Java語言中類只能單繼承與某個(gè)類,卻可以多集成接口。同時(shí)接口與接口之間可以多繼承。
為什么Java類只能單繼承?
“Java是一種簡(jiǎn)單的,面向?qū)ο蟮?,分布式的,解釋型的,健壯的,安全的,架?gòu)中立的,可移植的,高性能的,支持多線程的,動(dòng)態(tài)語言?!?/i>
以上這段話是James Gosling對(duì)于Java語言的定義。定義中提到Java的一個(gè)特性是簡(jiǎn)單。好,那接下來我們?cè)O(shè)想,Java是可以多繼承的,舉個(gè)例子,在這里有個(gè)A類,我們又編寫了兩個(gè)類B類和C類,并且B類和C類分別繼承了A類,并且對(duì)A類的同一個(gè)方法進(jìn)行了覆蓋。如果此時(shí)我們?cè)俅尉帉懥艘粋€(gè)D類,并且D類以多繼承的方式同時(shí)集成了B類和C類,那么D類也會(huì)繼承B類和C類從A類中重載的方法,那么問題來了,D類也開始犯迷糊了,我到底應(yīng)該哪個(gè)繼承哪個(gè)類中的方法呢,因?yàn)轭愂墙Y(jié)構(gòu)性的,這樣就會(huì)造成結(jié)構(gòu)上的混亂。這就是多繼承的菱形繼承問題。
學(xué)習(xí)過C++的同學(xué)可能會(huì)問,C++也是面向?qū)ο蟮?,為什么它卻可以多繼承的呢?首先,C++語言是1983年由貝爾實(shí)驗(yàn)室的Bjarne Stroustrup在C語言的基礎(chǔ)上推出的,Java語言是1995年由James Gosling和同事共同正式推出的。其次,在C++被設(shè)計(jì)出來后,就會(huì)經(jīng)常掉入多繼承這個(gè)陷阱,雖然它也提出了相應(yīng)的解決辦法,但Java語言本著簡(jiǎn)單的原則舍棄了C++中的多繼承,這樣也會(huì)使程序更具安全性。
為什么Java類可以集成多個(gè)接口?
Java接口是行為性的,也就是說它只是定義某個(gè)行為的名稱,而具體的行為的實(shí)現(xiàn)是集成接口的類實(shí)現(xiàn)的,因此就算兩個(gè)接口中定義了兩個(gè)名稱完全相同的方法,當(dāng)某個(gè)類去集成這兩個(gè)接口時(shí),類中也只會(huì)有一個(gè)相應(yīng)的方法,這個(gè)方法的具體實(shí)現(xiàn)是這個(gè)類來進(jìn)行編寫的,所以并不會(huì)出現(xiàn)結(jié)構(gòu)混亂的情況。
為什么Java接口與接口之間可以多繼承?
通過以上的闡述,我想這個(gè)問題也就迎刃而解了。
在這篇文章中有自己的一點(diǎn)點(diǎn)理解,如果有不正確的地方,請(qǐng)見諒,并私信或評(píng)論告訴我,謝謝。