Java抽象類與接口的異同及使用場合

什麼是抽象類?編程

抽象類是特殊的類,只是不能被實例化;除此之外,具備類的其餘特性;重要的是抽象類能夠包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們。另外,抽象類能夠派生自一個抽象類,能夠覆蓋基類的抽象方法也能夠不覆蓋,若是不覆蓋,則其派生類必須覆蓋它們。抽象類不能被密封。若是派生類沒有實現全部的抽象方法,則該派生類也必須聲明爲抽象類。設計模式

什麼是接口?函數

接口是包含一組虛方法的抽象類型,其中每一種方法都有其名稱、參數和返回值。接口方法不能包含任何實現,CLR容許接口能夠包含事件、屬性、索引器、靜態方法、靜態字段、靜態構造函數以及常數。spa

例子:飛機會飛,鳥會飛,他們都繼承了同一個接口「飛」;可是F22屬於飛機抽象類,鴿子屬於鳥抽象類。設計

 

相同點: (1)都不能被直接實例化,均可以經過繼承實現其抽象方法。繼承

              (2)都是面向抽象編程的技術基礎,實現了諸多的設計模式。索引

不一樣點:(1) 接口支持多繼承;抽象類不能實現多繼承。 接口只能定義抽象規則;接口

              (2)抽象類既能夠定義規則,還可能提供已實現的成員。 接口是一組行爲規範;事件

              (3)抽象類是一個不徹底的類,着重族的概念。 接口能夠用於支持回調;class

              (4)抽象類不能實現回調,由於繼承不支持。 接口只包含方法、屬性、索引器、事件的簽名,

                      但 不能定義字段和包含實現的方法;

               (5)抽象類能夠定義字段、屬性、包含有實現的方法。 接口能夠做用於值類型和引用類型;

               (6)抽象類只能做用於引用類型。例如,Struct就能夠繼承接口,而不能繼承類。

               (7)抽象類有構造方法,接口卻沒有構造方法。

接口的應用場合:

  1. 類與類以前須要特定的接口進行協調,而不在意其如何實現。
  2. 做爲可以實現特定功能的標識存在,也能夠是什麼接口方法都沒有的純粹標識。
  3. 須要將一組類視爲單一的類,而調用者只經過接口來與這組類發生聯繫。
  4. 須要實現特定的多項功能,而這些功能之間可能徹底沒有任何聯繫。

抽象類的應用場合:

一句話,在既須要統一的接口,又須要實例變量或缺省的方法的狀況下,就可使用它。最多見的有:

  1. 定義了一組接口,但又不想強迫每一個實現類都必須實現全部的接口。能夠用abstract class定義一組方法體,甚至能夠是空方法體,而後由子類選擇本身所感興趣的方法來覆蓋。
  2. 某些場合下,只靠純粹的接口不能知足類與類之間的協調,還必需類中表示狀態的變量來區別不一樣的關係。abstract的中介做用能夠很好地知足這一點。
  3. 規範了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,能夠共享的,無需子類分別實現;而另外一些方法卻須要各個子類根據本身特定的狀態來實現特定的功能
相關文章
相關標籤/搜索