類定義屬性和方法 描述某一類事物的抽象
而接口定義的是行為 並不限於任何具體意向
按照邏輯上來說 單繼承更明確 一個子類就應該是其父類代表的事物中的某個更具體的類別 不應該即是這種東西又是那種東西
而從實用角度上來說 單繼承易讀 易維護 語義清晰 邏輯清楚
而接口則不同 接口只定義一些公共行為 比如有兩個接口 一個定義了跑這個動作 另一個定義了走這個動作 人這個類就可以同時實現這兩個接口所定義的行為
類對接口的implements稱作實現 不能叫做繼承
當然 接口可以多繼承接口 因為接口只定義行為 並不包含類別的含義 不指代具體的某類事物 而且 從語義上來說 接口對接口的繼承稱之為擴展更為合適
鏈接: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的呢?