用樹莓派做網站服務器好嗎優(yōu)化一個網站需要多少錢
文章目錄
- 1. 語法層面的區(qū)別
- 1.1 成員屬性
- 1.2 成員方法
- 1.3 關系
- 2. 設計理念層面的區(qū)別(重點)
- 3. 舉例理解抽象類和接口在設計理念層面的區(qū)別
- 3.1 例一:門和警報
- 3.2 例二:招聘
- 3.3 例三:裝修房子
- 4. 總結
1. 語法層面的區(qū)別
1.1 成員屬性
- 抽象類:抽象類中的成員屬性可以是變量,也可以是常量
- 接口:接口中的成員屬性都是常量,默認由 public static final 關鍵字修飾
1.2 成員方法
- 抽象類:抽象類中的成員方法可以是具體的方法,也可以是抽象方法
- 接口:接口中的方法都是抽象方法,默認由 public abstract 關鍵字修飾(當然,JDK 8 及以后允許接口中有默認方法,這不在我們的討論范圍之內)
1.3 關系
- 類與類:一個類只能繼承一個類
- 類與接口:一個類可以實現(xiàn)單個或多個接口(接口不能繼承類)
- 接口和接口:一個接口可以繼承一個或多個接口
2. 設計理念層面的區(qū)別(重點)
- 抽象類:對事物的抽象,包括屬性和行為
- 接口:對行為的抽象,主要是行為
接口的設計目的是對類的行為進行約束,要求不同的類具有相同的行為,只約束行為的有無,但不限制如何實現(xiàn)行為
抽象類的設計目的是代碼復用,當不同的類具有某些相同的屬性和行為,可以讓這些類都派生于一個類,在這個類中抽象出屬性和行為,避免多次重復編寫定義屬性和行為的代碼,達到代碼復用的效果
正是因為行為可能沒有具體實現(xiàn),抽象類和接口不允許實例化,避免出現(xiàn)一些不可預測的情況發(fā)生
抽象類的功能大于接口,但是定義抽象類的代價很高,因為在 Java 中只能繼承一個類,所以需要在抽象類中編寫出所有子類的共性
接口在功能上會弱化不少,因為接口是針對某一個行為的描述,一個事物可能會有多種行為,所以一個類可以同時實現(xiàn)多個接口
設計抽象類的難度遠遠大于設計接口
3. 舉例理解抽象類和接口在設計理念層面的區(qū)別
我們通過幾個例子來理解抽象類和接口在設計理念層面的區(qū)別
3.1 例一:門和警報
我們知道,門都有 open 和 close 兩個動作,我們分別使用抽象類和接口來定義這個抽象概念
目前看來,使用抽象類和接口都沒有問題
隨著時代的發(fā)展,某些門具備了報警的功能,我們該如何實現(xiàn)報警(alarm)這個功能呢
思路一: 將 open、close、alarm 三個功能都放在同一個抽象類里面
這樣一來,所有繼承了抽象類的子類都會具備報警功能,但并不是所有的門都具備報警功能,所以這個思路不好
思路二:將 open、close、alarm 三個功能都放在同一個接口里面
需要實現(xiàn)報警功能的類,就重寫接口中的 alarm 方法
但實現(xiàn) Door 接口后同時也要重寫 open 和 close 方法,但是有一些具有報警功能的類并不具備 open 和 close 這兩個功能,例如火災報警器
思路二違反了設計模式六大基本原則中的接口隔離原則(至于什么是接口隔離原則,可以參考我的另一篇博文:設計模式的六大基本原則(開閉原則、單一職責原則、里氏替換原則、接口隔離原則、依賴倒置原則、迪米特法則))
由此可見,兩種思路的設計都有問題,那我們應該如何設計呢
open 和 close 是門應該具備的動作,而 alarm 是額外附加的行為,所以最好的設計思路就是將報警功能單獨設計為一個接口,將 open 和 close 放到抽象類 Door 中
3.2 例二:招聘
假如你是一個團隊的領導,那么你在招聘的時候會對應聘者會有一定的任職要求,只有滿足了這些要求才能參加面試,比如:
- 本科學歷
- 計算機相關專業(yè)
- 熟悉 Java
這個過程就相當于我們寫了一個面試的方法,同時定義了一個接口,然后將接口作為方法的參數,從而保證所有傳進來的參數,也就是來面試的應聘者都需要滿足任職要求
3.3 例三:裝修房子
毛坯房:指房屋建筑主體結構完工后,沒有進行室內裝修的房子。毛坯房通常具備基本的水電設施,但內部沒有進行墻面抹平、地面鋪設、門窗安裝等裝修工程,不具備直接入住的條件
假如你買了一個毛坯房,打算將房子裝修成自己喜歡的風格,在裝修過程中你會發(fā)現(xiàn),開發(fā)商給你預留好了燈座,但具體要安裝什么類型的燈,需要你自己決定,這個毛坯房就相當于一個抽象類
4. 總結
接口相當于定義規(guī)范,在 Java 代碼中,如果我們對方法的參數、方法的返回值有硬性的要求,我們就可以將這些要求定義到某一個接口中(相當于定義了規(guī)范)
抽象類可以理解為一個半成品,我們拿到抽象類以后,需要在抽象類的基礎上縫縫補補,才能得到一個完整的成品