抽象類和接口的區(qū)別,使用場景

作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項目的研發(fā)工作,涉及架構(gòu)設(shè)計、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。

1、相同點(diǎn)
     A. 兩者都是抽象類,都不能實(shí)例化。
     B. interface實(shí)現(xiàn)類及abstrct class的子類都必須要實(shí)現(xiàn)已經(jīng)聲明的抽象方法。

2.、不同點(diǎn)
     A. interface需要實(shí)現(xiàn),要用implements,而abstract class需要繼承,要用extends。
     B. 一個類可以實(shí)現(xiàn)多個interface,但一個類只能繼承一個abstract class。
     C. interface強(qiáng)調(diào)特定功能的實(shí)現(xiàn),而abstract class強(qiáng)調(diào)所屬關(guān)系。
    D. 盡管interface實(shí)現(xiàn)類及abstrct class的子類都必須要實(shí)現(xiàn)相應(yīng)的抽象方法,但實(shí)現(xiàn)的形式不同。interface中的每一個方法都是抽象方法,都只是聲明的(declaration, 沒有方法體),實(shí)現(xiàn)類必須要實(shí)現(xiàn)。而abstract class的子類可以有選擇地實(shí)現(xiàn)。
     這個選擇有兩點(diǎn)含義:
            一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子類必須實(shí)現(xiàn)。那些沒有abstract的方法,在Abstrct class中必須定義方法體。
            二是abstract class的子類在繼承它時,對非抽象方法既可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實(shí)現(xiàn),也可以通過再次聲明其方法為抽象的方式,無需實(shí)現(xiàn),留給其子類來實(shí)現(xiàn),但此類必須也聲明為抽象類。既是抽象類,當(dāng)然也不能實(shí)例化。
    E. abstract class是interface與Class的中介。
         interface是完全抽象的,只能聲明方法,而且只能聲明pulic的方法,不能聲明private及protected的方法,不能定義方法體,也不能聲明實(shí)例變量。然而,interface卻可以聲明常量變量,并且在JDK中不難找出這種例子。但將常量變量放在interface中違背了其作為接口的作用而存在的宗旨,也混淆了interface與類的不同價值。如果的確需要,可以將其放在相應(yīng)的abstract class或Class中。
       abstract class在interface及Class中起到了承上啟下的作用。一方面,abstract class是抽象的,可以聲明抽象方法,以規(guī)范子類必須實(shí)現(xiàn)的功能;另一方面,它又可以定義缺省的方法體,供子類直接使用或覆蓋。另外,它還可以定義自己的實(shí)例變量,以供子類通過繼承來使用。

3、interface的應(yīng)用場合
     A. 類與類之前需要特定的接口進(jìn)行協(xié)調(diào),而不在乎其如何實(shí)現(xiàn)。
     B. 作為能夠?qū)崿F(xiàn)特定功能的標(biāo)識存在,也可以是什么接口方法都沒有的純粹標(biāo)識。
     C. 需要將一組類視為單一的類,而調(diào)用者只通過接口來與這組類發(fā)生聯(lián)系。
     D. 需要實(shí)現(xiàn)特定的多項功能,而這些功能之間可能完全沒有任何聯(lián)系。

4、abstract class的應(yīng)用場合
      一句話,在既需要統(tǒng)一的接口,又需要實(shí)例變量或缺省的方法的情況下,就可以使用它。最常見的有:
      A. 定義了一組接口,但又不想強(qiáng)迫每個實(shí)現(xiàn)類都必須實(shí)現(xiàn)所有的接口??梢杂胊bstract class定義一組方法體,甚至可以是空方法體,然后由子類選擇自己所感興趣的方法來覆蓋。
      B. 某些場合下,只靠純粹的接口不能滿足類與類之間的協(xié)調(diào),還必需類中表示狀態(tài)的變量來區(qū)別不同的關(guān)系。abstract的中介作用可以很好地滿足這一點(diǎn)。
      C. 規(guī)范了一組相互協(xié)調(diào)的方法,其中一些方法是共同的,與狀態(tài)無關(guān)的,可以共享的,無需子類分別實(shí)現(xiàn);而另一些方法卻需要各個子類根據(jù)自己特定的狀態(tài)來實(shí)現(xiàn)特定的功能