接口和抽象類的區(qū)別

區(qū)別1:定義關鍵字不同
接口使用關鍵字 interface 來定義。 抽象類使用關鍵字 abstract 來定義。

區(qū)別2:繼承或實現(xiàn)的關鍵字不同
接口使用 implements 關鍵字定義其具體實現(xiàn)。 抽象類使用 extends 關鍵字實現(xiàn)繼承。

區(qū)別3:子類擴展的數(shù)量不同
接口的實現(xiàn)類可以有多個,而抽象類的子類,只能繼承一個抽象類

區(qū)別4:屬性訪問控制符不同
接口中屬性的訪問控制符只能是 public,接口中的屬性默認是 public static final 修飾的。
抽象類中的屬性訪問控制符無限制,可為任意控制符

區(qū)別5:方法控制符不同
接口中方法的默認控制符是 public,并且不能定義為其他控制符,

抽象類中的方法控制符無限制,其中抽象方法不能使用 private 修飾,

區(qū)別6:方法實現(xiàn)不同
接口中普通方法不能有具體的方法實現(xiàn),在 JDK 8 之后 static 和 default 方法必須有方法實現(xiàn),

static 或 default 方法如果沒有方法實現(xiàn)就會報錯,而普通方法如果有方法實現(xiàn)就會報錯。

抽象類中普通方法可以有方法實現(xiàn),抽象方法不能有方法實現(xiàn),

區(qū)別7:靜態(tài)代碼塊使用不同
接口中不能使用靜態(tài)代碼塊,抽象類中可以使用靜態(tài)代碼塊,

接口中可以有public static final 修飾的成員變量

抽象類不能被實例化(初學者很容易犯的錯),如果被實例化,就會報錯,編譯無法通過。只有抽象類的非抽象子類可以創(chuàng)建對象。

抽象類中不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

抽象類中的抽象方法只是聲明,不包含方法體,就是不給出方法的具體實現(xiàn)也就是方法的具體功能。

構造方法,類方法(用 static 修飾的方法)不能聲明為抽象方法。

抽象類的子類必須給出抽象類中的抽象方法的具體實現(xiàn),除非該子類也是抽象類。

抽象方法需要被實現(xiàn),不能被聲明為靜態(tài),private,final修飾

① 抽象類是對一種事物的抽象,即對類抽象,而接口是對行為的抽象。抽象類是對整個類整體進行抽象,包括屬性、行為,但是接口卻是對類局部(行為)進行抽象。

② 設計層面不同,抽象類作為很多子類的父類,它是一種模板式設計。而接口是一種行為規(guī)范,它是一種輻射式設計。

1.抽象類的使用場景

既想約束子類具有共同的行為(但不再乎其如何實現(xiàn)),又想擁有缺省的方法,又能擁有實例變量

如:模板方法設計模式,模板方法使得子類可以在不改變算法結構的情況下,重新定義算法中某些步驟的具體實現(xiàn)。

2.接口的應用場景

① 約束多個實現(xiàn)類具有統(tǒng)一的行為,但是不在乎每個實現(xiàn)類如何具體實現(xiàn)

② 作為能夠實現(xiàn)特定功能的標識存在,也可以是什么接口方法都沒有的純粹標識。

③ 實現(xiàn)類需要具備很多不同的功能,但各個功能之間可能沒有任何聯(lián)系。

④ 使用接口的引用調(diào)用具體實現(xiàn)類中實現(xiàn)的方法(多態(tài))

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容