第13講 | 談?wù)劷涌诤统橄箢愑惺裁磪^(qū)別?

典型回答

接口和抽象類是 Java 面向?qū)ο笤O(shè)計(jì)的兩個(gè)基礎(chǔ)機(jī)制。
接口是對行為的抽象,它是抽象方法的集合,利用接口可以達(dá)到 API 定義和實(shí)現(xiàn)分離的目的。接口,不能實(shí)例化;不能包含任何非常量成員,任何 field 都是隱含著 public static final的意義;同時(shí),沒有非靜態(tài)方法實(shí)現(xiàn),也就是說要么是抽象方法,要么是靜態(tài)方法。

抽象類是不能實(shí)例化的類,用 abstract 關(guān)鍵字修飾 class,其目的主要是代碼重用。除了不能實(shí)例化,形式上和一般的 Java類沒什么區(qū)別??梢杂幸粋€(gè)或者多個(gè)抽象方法,也可以沒有抽象方法。抽象類大多用于抽取相關(guān) Java 類的共用方法實(shí)現(xiàn)或者是共同成員變量,然后通過繼承的方式達(dá)到代碼復(fù)用的目的。

Java 類實(shí)現(xiàn) interface 使用 implements 關(guān)鍵詞,繼承 abstract class 則是使用 extends 關(guān)鍵詞。

為接口添加任何抽象方法,相應(yīng)的所有實(shí)現(xiàn)了這個(gè)接口的類,也必須實(shí)現(xiàn)新增方法,否則會(huì)出現(xiàn)編譯錯(cuò)誤。對于抽象類,如果我們添加非抽象方法,其子類只會(huì)享受到能力擴(kuò)展,而不用擔(dān)心編譯錯(cuò)誤。

有一類沒有任何方法的接口,通常叫作 Marker Interface,它的目的就是為了聲明實(shí)現(xiàn)接口的類具有某種特性。從表面看,這似乎和 Annotation 異曲同工,也確實(shí)如此。對于 Annotation,因?yàn)榭梢灾付▍?shù)和值,在表達(dá)能力更強(qiáng)。

Java 8 增加了函數(shù)式編程的支持,所以又增加了一類定義,即所謂 functional interface,簡單說就是只有一個(gè)抽象方法的接口,通常建議使用 @FunctionalInterface Annotation來標(biāo)記,Lambda 表達(dá)式本身可以看作是一類 functionalInterface.

從 Java 8 開始,interface 增加了對 對 default method 的支持。Java 9 以后甚至可以定義 private default method。Default method 提供了一種二進(jìn)制兼容的擴(kuò)展已有接口的方法。

面向?qū)ο笤O(shè)計(jì)

基本設(shè)計(jì)原則SOLID

  • 單一職責(zé)(Single Responsibility),類或或者對象最好是只有單一職責(zé),在程序設(shè)計(jì)中如果發(fā)現(xiàn)某個(gè)類承擔(dān)著多種義務(wù),可以考慮進(jìn)行拆分。

  • 開關(guān)原則(Open-Close, Open for extension, close for modification),對擴(kuò)展放開,對修改關(guān)閉。程序設(shè)計(jì)應(yīng)保證平滑的擴(kuò)展性,盡量避免因?yàn)樾略鐾惞δ芏薷囊延泄δ?。這樣可以少產(chǎn)出些回歸(regression)問題。

  • 里氏替換(Liskov Substitution),這是面向面向?qū)ο蟮幕疽刂唬M(jìn)行-繼承關(guān)系抽象時(shí),凡是可以用父類或者基類的地方,都可以用子類替換。

  • 接口分離(Interface Segregation),我們在進(jìn)行類和接口設(shè)計(jì)時(shí),如果在一個(gè)接口里定義了太多方法,其子類很可能面臨兩難,就是只有部分方法對它是有意義的,這就破壞了程序的內(nèi)聚性。 對于這種情況,可以通過拆分成功能單一的多個(gè)接口,將行為進(jìn)行解耦。在未來維護(hù)中,如果某個(gè)接口設(shè)計(jì)有變,不會(huì)對使用其他接口的子類構(gòu)成影響。

  • 依賴反轉(zhuǎn)(Dependency Inversion),實(shí)體應(yīng)該依賴于抽象而不是實(shí)現(xiàn)。也就是說高層次模塊,不應(yīng)該依賴于低層次模塊,而是應(yīng)該基于抽象。實(shí)踐這一原則是保證產(chǎn)品代碼之間適當(dāng)耦合度的法寶。

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

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

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