Abstract class | Interface | |
實例化 | 不能 | 不能 |
類 | 一種繼承關系,一個類只能使用一次繼承關系。可以通過繼承多個接口實現多重繼承 | 一個類可以實現多個interface |
數據成員 | 可有自己的 | 靜態的不能被修改即必須是static final,一般不在此定義 |
方法 | 可以私有的,非abstract方法,必須實現 | 不可有私有的,默認是public,abstract類型 |
變量 | 可有私有的,默認是friendly型,其值可以在子類中重新定義,也可以重新賦值 | 不可有私有的,默認是public static final型,且必須給其初值,實現類中不能重新定義,不能改變其值。 |
設計理念 | 表示的是“is-a”關系 | 表示的是“like-a”關系 |
實現 | 需要繼承,要用extends | 要用implements |
什么情況下使用接口
A. 類與類之前需要特定的接口進行協調,而不在乎其如何實現。
B. 作為能夠實現特定功能的標識存在,也可以是什么接口方法都沒有的純粹標識。
C. 需要將一組類視為單一的類,而調用者只通過接口來與這組類發生聯系。
D. 需要實現特定的多項功能,而這些功能之間可能完全沒有任何聯系。
什么情況下使用抽象類
一句話,在既需要統一的接口,又需要實例變量或缺省的方法的情況下,就可以使用它。最常見的有:
A. 定義了一組接口,但又不想強迫每個實現類都必須實現所有的接口。可以用abstract class定義一組方法體,甚至可以是空方法體,然后由子類選擇自己所感興趣的方法來覆蓋。
B. 某些場合下,只靠純粹的接口不能滿足類與類之間的協調,還必需類中表示狀態的變量來區別不同的關系。abstract的中介作用可以很好地滿足這一點。
C. 規范了一組相互協調的方法,其中一些方法是共同的,與狀態無關的,可以共享的,無需子類分別實現;而另一些方法卻需要各個子類根據自己特定的狀態來實現特定的功能。
新聞熱點
疑難解答