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

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

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

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

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

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