1. 程式人生 > >基礎 | Java的介面與抽象類

基礎 | Java的介面與抽象類

在Java中,四大基本特性的「抽象性」是通過兩種方式來體現的,包括介面和抽象類。兩者看似相同,實則有很多不同之處,面試中也經常會被問到 「談談對介面與抽象類的理解?介面與抽象類有什麼區別?兩者分別在什麼場景中使用?」 等問題,在此做一個系統的梳理與總結,建議重點關注。


談談對介面與抽象類的理解?

介面是對行為的抽象,其可以含有屬性和方法。

  • 屬性被隱式指定為public static final的,即全域性常量。
  • 方法被隱式執行為public abstract的,即抽象方法。

也就是說,介面中的所有方法都必須為抽象方法,不能有具體實現。所以說,介面是對行為的抽象。

抽象類是對類(一類事物)的抽象,《Java程式設計思想》一書中將抽象類定義為包含抽象方法的類,但準確來說,包含抽象方法的類一定是抽象類,但抽象類不一定有抽象方法,只要用abstract修飾即可為抽象類,但個人認為沒有抽象方法的抽象類並沒有實際意義吧?

抽象類可以含有屬性、方法和構造器。

  • 方法可以是普通方法也可以是抽象方法,若為抽象方法則必須為public或protected的,預設情況下預設為public的,因為抽象方法需要被子類繼承和實現。
  • 構造器雖然有,但因為抽象類含有無具體實現的方法,所以抽象類不能進行例項化。

介面與抽象類的區別 見下一題。


介面與抽象類有什麼區別?

語法層面上的區別:

  • 成員變數:抽象類中的成員變數可以是各種型別的,而介面中的成員變數只能是常量,即public static final修飾的。
  • 成員方法:抽象類中的成員方法可以是抽象的也可以是普通的(有具體實現的),而介面中的成員方法只能是public static修飾的。
  • 靜態結構:抽象類中可以有靜態程式碼塊和靜態方法,而介面中不能有靜態程式碼塊和靜態方法。
  • 構造方法:抽象類中可以有構造器,而介面中沒有,但兩者都不能進行例項化,但可以定義抽象類和介面型別的引用。
  • 繼承與實現:一個類只能繼承一個抽象類,而一個類卻可以實現多個介面。

設計層面上的區別:

  • 抽象類是對類(一類事物)的抽象,而介面是對行為的抽象。再具體一點說,抽象類是對一類事物整體(包括屬性和行為)進行抽象,而介面是對類的區域性(僅對行為)進行抽象。如飛機、鳥和飛行而言,應分別將其設計為類、類和介面。
  • 抽象類作為很多子類的父類,是一種模板式設計,而介面作為一種行為規範,是一種輻射式設計。如果需要新增新的方法,抽象類作為模板,可以直接新增帶具體實現的方法而無需改變子類,而介面作為規範,規範改變(新增行為),遵守規範的子類都必須進行相應的改動。

介面與抽象類分別在什麼場景中使用?

問題同「你在專案中哪些地方使用過介面和抽象類?具體是怎麼使用的?」

建議閱讀「門與警報」的例子。

門都有開啟和關閉兩個行為,此時若需要門具備警報行為,應該如何實現呢?

其實,門的開啟和關閉屬於門本身固有的行為,而警報功能屬於門非固有的行為(附加行為)。最佳解決方案是,將門設計為一個抽象類,包括開啟和關閉兩種行為,而將警報設計為一個介面,包括警報行為,進而設計一個警報門繼承抽象類並實現警報介面即可。


擴充套件面試題

問:介面與抽象類哪個更為抽象?

答:介面,因為抽象類中可以定義構造器,可以有抽象方法和具體方法,而介面中不能定義構造器而且其中的方法全部都是抽象方法,故介面比抽象類更為抽象。


推薦閱讀


歡迎關注

Java名企面試吧,每天10點24分,我們不見不散!

丙子先生的宗旨是,每天以短篇幅講高頻面試題,不增加太多負擔,但需要持之以恆。

能力有限,歡迎指教!