類定義屬性和方法 描述某一類事物的抽象
而接口定義的是行爲 並不限於任何具體意向 java
按照邏輯上來講 單繼承更明確 一個子類就應該是其父類表明的事物中的某個更具體的類別 不該該便是這種東西又是那種東西
而從實用角度上來講 單繼承易讀 易維護 語義清晰 邏輯清楚 ide
而接口則不一樣 接口只定義一些公共行爲 好比有兩個接口 一個定義了跑這個動做 另外一個定義了走這個動做 人這個類就能夠同時實現這兩個接口所定義的行爲 學習
類對接口的implements稱做實現 不能叫作繼承 繼承
固然 接口能夠多繼承接口 由於接口只定義行爲 並不包含類別的含義 不指代具體的某類事物 並且 從語義上來講 接口對接口的繼承稱之爲擴展更爲合適接口
先舉一個多重繼承的例子,咱們定義一個動物(類)既是狗(父類1)也是貓(父類2),兩個父類都有「叫」這個方法。那麼當咱們調用「叫」這個方法時,它就不知道是狗叫仍是貓叫了,這就是多重繼承的衝突。io
而java對此的解決方法是,一個物體的本質只能有一個。一個動物只能是狗或只能是貓,若是你想創造一個會玩毛線球會玩激光(被激光玩?)的狗,那麼只須要創造一個描述這類行爲的接口(就叫玩耍吧),而後在本身的類裏面實現「玩耍」接口,具體實現這些玩的行爲,最終你一樣會獲得一個既像狗又像貓的動物。若是你想讓這個動物叫起來像貓而不是狗,那麼使用覆寫(override)機制,子類裏從新定義「叫」這個行爲便可。可是不管如何,這樣獲得的類是絕對不會有多重繼承的衝突的。class
再來講說abstract class和interface的區別。變量
abstract class的核心在於,我知道一類物體的部分行爲(和屬性),可是不清楚另外一部分的行爲(和屬性),因此我不能本身實例化。仍是剛纔那個例子,若是你有個abstract class叫哺乳動物,那麼你能夠定義他們胎生,恆定體溫等共同的行爲,可是具體「叫」這個行爲時,你得留着讓非abstract的狗和貓等等子類具體實現。擴展
interface的核心在於,我只知道這個物體能幹什麼,具體是什麼不須要聽從類的繼承關係。好比上述的「玩耍」interface,狗有狗的玩法,貓有貓的玩法,妖魔鬼怪機器人均可以玩耍,只要你告訴我這個物體有玩耍接口,我就能讓它玩起來(๑•̀ㅂ•́) ✧方法
因此abstract class和interface是不能互相替代的,interface不能定義(它只作了聲明)共同的行爲,事實上它也不能定義「很是量」的變量。而abstract class只是一種分類的抽象,它不能橫跨類別來描述一類行爲,它使得針對「別的分類方式」的抽象變得沒法實現(因此須要接口來幫忙)。而多重繼承不但會形成衝突,還讓一個類變得不三不四,看不出這個類的本質,因此java毅然捨棄掉了這個禍害。
不知題主有沒有理解一些。