抽象類和接口以及二者的區別

1.抽象類

簡單的說,抽象類就是一個特殊的父類。特殊是因爲,它包含abstract方法,同時,包含抽象方法的類在聲明時也要加上abstract修飾。記住,抽象類是爲了繼承而存在的。它有幾個特點:
(1)抽象方法必須爲public或者protected,不能是private
(2) 抽象類不能用來創建對象(無法實例化),因爲它包含抽象方法,一般抽象方法是沒有具體實現的,後面會說爲什麼這樣做。
(3) 抽象類的子類必須實現父類聲明的抽象方法,如果沒實現,則字子類也必須聲明爲abstract類。

到這裏,可能大家會覺得爲什麼要有抽象類啊,貌似一般的類就夠了啊!其實不然,很多時候確實有些父類中的方法確實沒有必要寫,因爲各個子類中的這個方法肯定會有不同,所以沒有必要再父類裏寫

之前看到一個經典的例子:
假如我們要實現一個俄羅斯方塊遊戲,要考慮的其中一點就是,俄羅斯方塊有六種,每一種方塊都可以變換形態,我們會想到定義一個父類—方塊類,裏面寫個方法transfer()然後六種具體的方塊繼承方塊類,去重寫transfer方法。這裏面的問題是,六種具體方塊的形態變換方法是不一樣的,比如“田”子方塊,它變來變去還是他,所以父類中我們無需寫具體的實現,這是個空方法啊!所以我們將其聲明爲抽象方法,這樣所有的具體方塊類都得重寫它,我們下次想增加更多的方塊,只要繼承它然後重寫transfer方法就行。
這樣說,是不是對抽象類有了點感悟呢?23333

2.接口

接口其實不用多說了,它更多的是一種行爲的抽象。實現不同的接口相當於給java提供的變相的“多繼承”。說明一點:接口中的變量會被隱式地指定爲public static final變量(並且只能是public static final變量,用private修飾會報編譯錯誤),而方法會被隱式地指定爲public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤),並且接口中所有的方法不能有具體的實現,也就是說,接口中的方法必須都是抽象方法。從這裏可以隱約看出接口和抽象類的區別,接口是一種極度抽象的類型,它比抽象類更加“抽象”,並且一般情況下不在接口中定義變量。如果一個非抽象類遵循了某個接口,就必須實現該接口中的所有方法。對於遵循某個接口的抽象類,可以不實現該接口中的抽象方法。

3.抽象類和接口區別

  1. 從語法方面:
    (1) 抽象類中成員變量可以任意類型,接口中只能是public static final的(接口中一般不寫成員變量)
    (2) 抽象類中可以有靜態代碼和靜態方法,接口則不行
    (3) 抽象類的繼承是單一的,但一個類可以實現多個接口
    (4) 抽象類可以提供方法的實現細節,接口只能是提供方法的聲明
  2. 設計方面:
    (1) 抽象類是對事物的抽象,對類抽象,而接口是對行爲抽象。抽象類對整個實體進行描述,包括屬性、方法,接口是對局部(行爲)進行描述。比如:貓和狗是不同的動物,但是都有一個特點,會奔跑,我們可以把“奔跑”這種行爲設計爲接口。
    (2) 對於抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實現,子類可以不進行變更;而對於接口則不行,如果接口進行了變更,則所有實現這個接口的類都必須進行相應的改動。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章