單繼承與多繼承對比

先舉一個多重繼承的例子,咱們定義一個動物(類)既是狗(父類1)也是貓(父類2),兩個父類都有「叫」這個方法。那麼當咱們調用「叫」這個方法時,它就不知道是狗叫仍是貓叫了,這就是多重繼承的衝突。java

 

而java對此的解決方法是,一個物體的本質只能有一個。一個動物只能是狗或只能是貓,若是你想創造一個會玩毛線球的狗,那麼只須要創造一個描述這類行爲的接口(就叫玩耍吧),而後在本身的類裏面實現「玩耍」接口,具體實現這些玩的行爲,最終你一樣會獲得一個既像狗又像貓的動物。若是你想讓這個動物叫起來像貓而不是狗,那麼使用重寫(override)機制,子類裏從新定義「叫」這個行爲便可。可是不管如何,這樣獲得的類是絕對不會有多重繼承的衝突的。ide

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

abstract class的核心在於,我知道一類物體的部分行爲(和屬性),可是不清楚另外一部分的行爲(和屬性),因此我不能本身實例化。仍是剛纔那個例子,若是你有個abstract class叫哺乳動物,那麼你能夠定義他們胎生,恆定體溫等共同的行爲,可是具體「叫」這個行爲時,你得留着讓非abstract的狗和貓等等子類具體實現。繼承

interface的核心在於,我只知道這個物體能幹什麼,具體是什麼不須要聽從類的繼承關係。好比上述的「玩耍」interface,狗有狗的玩法,貓有貓的玩法,妖魔鬼怪機器人均可以玩耍,只要你告訴我這個物體有玩耍接口,我就能讓它玩起來(๑•̀ㅂ•́) ✧接口

因此abstract class和interface是不能互相替代的,interface不能定義(它只作了聲明)共同的行爲,事實上它也不能定義「很是量」的變量。而abstract class只是一種分類的抽象,它不能橫跨類別來描述一類行爲,它使得針對「別的分類方式」的抽象變得沒法實現(因此須要接口來幫忙)。而多重繼承不但會形成衝突,還讓一個類變得不三不四,看不出這個類的本質,因此java毅然捨棄掉了這個禍害。class


多繼承:    單繼承:變量

相關文章
相關標籤/搜索