抽象類與接口

常常搞不清抽象類和接口之間的關係,因此決定記下來php

抽象類

  《Thinking in Java》一書中對抽象類的定義爲:html

包含了抽象方法的一個類叫做「抽象類」。若是一個類裏包含了一個或多個抽象方法,類就必須指定成
abstract(抽象)。不然,編譯器會向咱們報告一條出錯消息。 web

  其實用關鍵字abstract修飾的類便是抽象類,即便該類中沒有用abstract修飾的抽象方法。編程

抽象方法

  抽象方法是一種特殊的方法:它只有聲明,而沒有具體的實現。抽象方法的聲明格式爲:svg

abstract void method_name()

  抽象方法必須用 abstract 修飾,含有抽象方法的類就是抽象類,必須在類前用 abstract 修飾。
因爲抽象類中含有無具體實現的方法,因此不能用抽象類建立對象。函數

  由此能夠看出抽象類就是爲了被繼承而存在的,抽象類中包含了子類的共通特性。若是定義了一個抽象類卻不去繼承它,至關於白白建立了這個抽象類。
  同時,抽象類也跟普通類同樣,能夠擁有成員變量和普通的成員方法。spa

抽象類和普通類的區別  

  1. 抽象方法必須爲public或者protected,缺省狀況下默認爲public。若是用private修飾,則該方法不能被子類繼承,子類便沒法實現該方法。
  2. 抽象類不能實例化,即不能建立對象。
  3. 若是一個類繼承了一個抽象類,則該類必須實現父類的抽象方法。若是子類沒有實現父類的抽象方法,則必須將子類也定義爲abstract類。

接口

  接口,英文稱做interface。在軟件工程中,接口泛指供別人調用的方法或者函數,是對行爲的抽象。在Java中,定一個接口的形式以下:code

[public] interface InterfaceName {
}

  接口中能夠包含基本數據類型的數據成員和方法,須要注意的是接口中的數據成員都默認爲static和final,接口中方法只能是public abstract修飾的抽象方法。
  接口中的全部方法都不能有具體實現。實現接口的類必須實現接口中全部的抽象方法,一個類能夠實現多個接口,經過關鍵字implementsxml

class className implements interface1,interface2,[...]{
}

  若是抽象類實現了一個接口,該抽象類能夠不實現接口中的抽象方法。htm

抽象類與接口的區別

參數 抽象類 接口
默認的方法實現 能夠有默認的方法實現 接口徹底是抽象的。它根本不存在方法的實現
實現 子類經過extents關鍵字繼承抽象類。若是子類不是抽象類,須要實現父類中全部聲明的方法的實現 子類經過關鍵字implements實現接口,須要提供接口中全部生命方法的實現
構造器 能夠有構造器 不能有構造器
與普通類的區別 除了不能實例化,其餘的跟普通類沒有任何區別 接口是徹底不一樣的類型
訪問修飾符 抽象類方法能夠用public、protected和default修飾 接口方法只能用public修飾,成員屬性只能定義爲 public static final
main方法 抽象類能夠有main方法且能夠運行 接口沒有main方法,不能運行
多繼承 抽象方法能夠繼承一個類或者實現多個接口 只能繼承一個或多個接口
速度 速度比接口要快 接口是稍微有點慢的,由於它須要時間去尋找在類中實現的方法。
添加新方法 若是在抽象類中添加新方法,能夠給該方法提供默認的實現,不須要改變如今的代碼 在接口中添加新方法後必須改變實現該接口的類




何時使用抽象類和接口 

  1. 若是你擁有一些方法而且想讓它們中的一些有默認實現,那麼使用抽象類吧。
  2. 若是你想實現多重繼承,那麼你必須使用接口。因爲Java不支持多繼承,子類不可以繼承多個類,但能夠實現多個接口。所以你就可使用接口來解決它。
  3. 若是基本功能在不斷改變,那麼就須要使用抽象類。若是不斷改變基本功能而且使用接口,那麼就須要改變全部實現了該接口的類。

參考資料:

  http://www.importnew.com/18780.html
  http://www.importnew.com/12399.html   《Java編程思想》

相關文章
相關標籤/搜索