Java篇—抽象類和接口的區別(乾貨)

一、抽象類

關鍵字abstract修飾的類叫做抽象類。

就是比如我們熟悉的泰迪,哈巴,二哈,阿拉斯加,秋田犬等等大小形態有很大區別,我們怎麼把他們抽象一下呢?那就是他們都有一些本質上相同的東西那就是他們都是狗,是狗就有耳朵,尾巴,四肢等等我們把這些給抽象出來,至於耳朵是啥樣的,尾巴是長是短,顏色是啥,這就需要子類實現狗這個抽象方法了。

關鍵字abstract說明:    

1.abstract修飾的類爲抽象類,此類不能有對象,(無法對此類進行實例化,說白了就是不能new);

2.abstract修飾的方法爲抽象方法,此方法不能有方法體(就是什麼內容不能有,在方法後面加一個大括號而裏面什麼都不寫也是不行的);

抽象類知識get:

 1.抽象類不能有對象,不能用new此關鍵字來創建抽象類的對象;

 2.有抽象方法的類一定是抽象類,但是抽象類中不一定有抽象方法;

 3.抽象類中的抽象方法必須在子類中被重寫。

抽象類的作用:

1.用於隱藏

對對象的具體類型進行隱藏,我們可以構造出一個固定的一組行爲的抽象描述,一個行爲可以有任意個可能的具體實現方式。這個抽象的描述就是抽象類。(多態)

2.用於拓展對象的行爲功能

這一組任意個可能的具體實現表現爲所有可能的子類,模塊可以操作一個抽象類,由於模塊依賴於一個固定的抽象類,那麼他是不允許修改的。同時通過這個抽象類進行派生,拓展此模塊的行爲功能。(開放閉合原則)

思考題:抽象類不能被“new”,抽象方法必須重寫,那麼定義它們做什麼?

答:抽象類生來就註定它是要被繼承的,如果沒有任何一個類去繼承它的話,那麼也就失去了它的意義;抽象方法生來就是要被重寫的,而且是必須重寫。(只要繼承了某個抽象類,就必須去重寫此抽象類中含有的抽象方法)

二、接口

接口就是一個規範和抽象類比較相似。它只管做什麼,不管怎麼做。通俗的講,藉口就是某個事物對外提供的一些功能的聲明,其定義和類比較相似,只不過是通過interface關鍵字來完成。

接口知識get:

1.接口中的所有屬性默認爲:public static final ****(屬性不能夠被更改);

2.接口中的所有方法默認爲:public abstract ****(方法默認爲抽象方法,實現類必須去重寫接口中的方法);

3.接口不再像類一樣用關鍵字 extends去“繼承”,而是用 implements 去“實現”,也就是說類和接口的關係叫做實現,(例如:A類實現了B接口,那麼稱A爲B接口的實現類。而類與類之間的繼承的話,叫做A類繼承了B類,其中B類爲A類的父類(基類),A類爲B類的子類(派生類))。實現接口與類的繼承比較相似。    

接口的作用:

1.由於Java單繼承的原因,所以需要曲線救國,接口是作爲繼承關係的一個補充。

2.把程序模塊進行固化的契約,降低偶合。把若干功能拆分出來,按照契約來進行實現和依賴。(依賴倒置原則)

3.定義接口有利於代碼的規範。(接口分離原則)

三、抽象類和接口的異同

接口和抽象類相同點:

1.都不能被實例化;

2.接口的實現類和抽象類的子類只有全部實現了接口或者抽象類中的方法後纔可以被實例化。

接口和抽象類的區別:

1.接口只能定義抽象方法不能實現方法,抽象類既可以定義抽象方法,也可以實現方法;

2.單繼承,多實現。接口可以實現多個,只能繼承一個抽象類;

3.接口強調的是功能,抽象類強調的是所屬關係;

4.接口中的所有成員變量 爲public static final, 靜態不可修改,當然必須初始化。接口中的所有方法都是public abstract 公開抽象的。而且不能有構造方法。抽象類就比較自由了,和普通的類差不多,可以有抽象方法也可以沒有,可以有正常的方法,也可以沒有;

5.abstract class 表示的是is a關係(是不是這個對象的一種),interface表示的是like a關係(有沒有這個功能)。
抽象類強調的是從屬關係,接口強調的是功能。

福利來了,抽象類和接口精心繪製圖解

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章