抽象類 vs 接口(Java)

  • 對於abstract class和interface的選擇反映出對於問題領域本質的理解、對於設計意圖的理解是否正確、合理。
  • 一個類可以繼承多個接口,當沒有缺省的實現用來繼承時,通常使用接口而不適用抽象類。
  • 抽象類可以有私有方法和私有成員,接口是公開的,裏面不能有私有成員和方法。
  • 抽象類中可以賦予方法默認行爲,接口中方法不能有默認行爲。
  • 實現抽象類可以有選擇地重寫需要用到的方法,實現接口的一定要實現接口裏定義的所有方法。
  • 接口可以實現多重繼承,而一個類只能繼承一個父類,但可以通過繼承多個接口實現多重繼承。
  • 抽象類中可以有自己的數據成員,默認是protected 型,其值可以在子類中重新定義,也可以重新賦值。接口中只能夠有靜態的不能被修改的數據成員 即必須是static final(默認爲public static final) 的並必須給其初值(接口中一般不定義數據成員)
  • 抽象類中可以有abstract的成員方法,也可以有非 abstract的成員方法 接口中所有的成員方法都是abstract的,默認都是 public abstract 類型
  • 兩者都不能被實例化。 從某種意義上說,interface是一種特殊形式的 abstract class  一般的應用裏,最頂級的是接口,然後是抽象類實現接 最後纔到具體類實現。
  • 抽象類主要用來進行類型隱藏,在Java語言中體現了一種繼承關係 要想使得 繼承關係合理 父類和派生類之間必須存在"is-a"關係,即父類和派生類在概念本質上應該是相同。 對於接口則並不要求接口的實現者和接口定義在概念本質上是一致的, 僅僅是實現了接口定義的契約而已。 
  • 通過接口定義行爲能夠更有效地分離行爲與實現,爲代碼的維護和修改帶來方便,其中的關鍵在於區分對象的行爲和對象的實現
  • 行爲模型應該總是通過接口而不是抽象類定義 行爲模型應該總是通過接口而不是抽象類定義
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章