13.Java為什么不支持多繼承


類定義屬性和方法 描述某一類事物的抽象
而接口定義的是行為 並不限於任何具體意向

按照邏輯上來說 單繼承更明確 一個子類就應該是其父類代表的事物中的某個更具體的類別 不應該即是這種東西又是那種東西
而從實用角度上來說 單繼承易讀 易維護 語義清晰 邏輯清楚

而接口則不同 接口只定義一些公共行為 比如有兩個接口 一個定義了跑這個動作 另一個定義了走這個動作 人這個類就可以同時實現這兩個接口所定義的行為

類對接口的implements稱作實現 不能叫做繼承

當然 接口可以多繼承接口 因為接口只定義行為 並不包含類別的含義 不指代具體的某類事物 而且 從語義上來說 接口對接口的繼承稱之為擴展更為合適

 

作者:chao wang
鏈接:https://www.zhihu.com/question/24317891/answer/65289659
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

先舉一個多重繼承的例子,我們定義一個動物(類)既是狗(父類1)也是貓(父類2),兩個父類都有“叫”這個方法。那么當我們調用“叫”這個方法時,它就不知道是狗叫還是貓叫了,這就是多重繼承的沖突。


而java對此的解決方法是,一個物體的本質只能有一個。一個動物只能是狗或只能是貓,如果你想創造一個會玩毛線球會玩激光(被激光玩?)的狗,那么只需要創造一個描述這類行為的接口(就叫玩耍吧),然后在自己的類里面實現“玩耍”接口,具體實現這些玩的行為,最終你同樣會得到一個既像狗又像貓的動物。如果你想讓這個動物叫起來像貓而不是狗,那么使用覆寫(override)機制,子類里重新定義“叫”這個行為即可。但是無論如何,這樣得到的類是絕對不會有多重繼承的沖突的。

再來說說abstract class和interface的區別。

abstract class的核心在於,我知道一類物體的部分行為(和屬性),但是不清楚另一部分的行為(和屬性),所以我不能自己實例化。還是剛才那個例子,如果你有個abstract class叫哺乳動物,那么你可以定義他們胎生,恆定體溫等共同的行為,但是具體“叫”這個行為時,你得留着讓非abstract的狗和貓等等子類具體實現。

interface的核心在於,我只知道這個物體能干什么,具體是什么不需要遵從類的繼承關系。比如上述的“玩耍”interface,狗有狗的玩法,貓有貓的玩法,妖魔鬼怪機器人都可以玩耍,只要你告訴我這個物體有玩耍接口,我就能讓它玩起來(๑•̀ㅂ•́) ✧

所以abstract class和interface是不能互相替代的,interface不能定義(它只做了聲明)共同的行為,事實上它也不能定義“非常量”的變量。而abstract class只是一種分類的抽象,它不能橫跨類別來描述一類行為,它使得針對“別的分類方式”的抽象變得無法實現(所以需要接口來幫忙)。而多重繼承不但會造成沖突,還讓一個類變得不倫不類,看不出這個類的本質,所以java毅然舍棄掉了這個禍害。

不知題主有沒有理解一些。
 
要是實現多繼承的話,新手們學習和使用的難度不是增加了?!
class A {
void say() {
}
}
class B {
void say() {
}
}
如果C繼承A和B,那么是報錯呢還是說在要調用say方法的時候指定是A的還是B的呢?




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM