抽象類是對類的抽象,接口是對行為的抽象
區別:
相同點
接口和抽象類都不能被實例化,它們都位於繼承樹的頂端,用於被其他類實現和繼承。
接口和抽象類都可以包含抽像方法,實現接口或繼承抽象類的普通子類都必須實現這些抽象方法。
不同點
接口中只能包含抽象方法,而抽象類則完全可以包含普通方法。
接口中不能定義靜態方法,而抽象類中可以定義靜態方法。
接口中只能定義靜態常量,不能定義普通變量,或非靜態的常量,而抽象類中則可以定義不同的屬性,也可以定義靜態的屬性。
接口中不包含構造器,而抽象類中可以包含構造器,抽象類中的構造器並不用於創建對象,而是讓其子類調用這些構造器來完成抽象類的初始化操作。
一個類最多只能有一個直接父類,包括抽象類,而一個類可以實現多個接口。通過實現多個接口可以彌補Java單繼承的不足。
什么時候用抽象類?什么時候用接口?
滿足以下條件是最好使用抽象類:
a)子類不繼承其它父類
b)子類中存在完全相同的功能實現的方法
c)子類中存在相同的屬性
d)設計出的結構需要繼承其它類
當需要滿足d條件時,只能使用抽象類,抽象類可以繼承類,而接口不能。抽象類是一個類,所以在設計時可以使抽象類繼承其它的類,在已有類的基礎上進行設計,但是接口不能繼承類。
否則也可以考慮使用接口實現。
滿足以下條件是最好使用接口:
a)子類已經繼承了其它父類
b)子類中不存在完全相同的功能實現方法
c)子類中不存在相同的屬性
d)設計出的結構不需要繼承其它類
當需要滿足a條件時,只能使用接口,常把接口用於建 立 類 和 類 之間的一個“協議”。否則也可以考慮使用抽象類實現。