Java抽象類與接口的區(qū)別和應用場景

abstract 與 interface

據(jù)說是常見面試題。

抽象類與接口的語法區(qū)別:

抽象類與接口
  1. 構(gòu)造方法:抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法
  2. 成員變量:抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。
  3. 普通成員變量:抽象類中可以有普通成員變量,接口中沒有普通成員變量
  4. 普通方法:抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的方法聲明,不能有非抽象的普通方法
  5. 靜態(tài)方法:抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法(JDK1.8中開始接口中可以定義 公開靜態(tài)方法,擁有方法體,接口名直接調(diào)用)
  6. 訪問權(quán)限:抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,并且默認即為public abstract類型。
  7. 與類關(guān)系:一個類可以實現(xiàn)多個接口,但只能繼承一個抽象類。
抽象類被子類繼承,接口被類實現(xiàn)
接口中除公開靜態(tài)方法,不能有方法體
抽象類屬性是普通變量,接口中是公開靜態(tài)常量
抽象類是重構(gòu)的結(jié)果,接口是設(shè)計的結(jié)果
抽象類可定義方法和屬性,接口中只能有抽象方法和不可變常量
抽象類抽象的是類別,接口抽象的是功能

抽象類與接口的應用場景

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

一句話,在既需要統(tǒng)一的接口,又需要實例變量或缺省的方法的情況下,就可以使用它。最常見的有:

  1. 定義了一組接口,但又不想強迫每個實現(xiàn)類都必須實現(xiàn)所有的接口。可以用abstract class定義一組方法體,甚至可以是空方法體,然后由子類選擇自己所感興趣的方法來覆蓋。
  2. 某些場合下,只靠純粹的接口不能滿足類與類之間的協(xié)調(diào),還必需類中表示狀態(tài)的變量來區(qū)別不同的關(guān)系。abstract的中介作用可以很好地滿足這一點。
  3. 規(guī)范了一組相互協(xié)調(diào)的方法,其中一些方法是共同的,與狀態(tài)無關(guān)的,可以共享的,無需子類分別實現(xiàn);而另一些方法卻需要各個子類根據(jù)自己特定的狀態(tài)來實現(xiàn)特定的功能

【總結(jié)】
任何抽象類都應該適應真正的需求而產(chǎn)生的。
當必須時,應該實現(xiàn)接口而不是到處添加額外級別的繼承,并由此會帶來額外的復雜性。這種額外的復雜性非常顯著,如果你讓某人去處理這種復雜性,只是因為你意識到由于以防萬一而添加了新接口,而沒有其他更有說服力的原因,那么好吧,如果我碰上了這種事,就會質(zhì)疑此人所作的所有設(shè)計了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容