抽象類是用來捕捉子類的通用特性的。接口是抽象方法的集合。
從設計層面來說,抽象類是對類的抽象,是一種模板設計,接口是行為的抽象,是一種行為的規範。
相同點
- 接口和抽象類都不能實例化
- 都位於繼承的頂端,用於被其他實現或繼承
- 都包含抽象方法,其子類都必須覆寫這些抽象方法
不同點
備註:Java8中接口中引入默認方法和靜態方法,以此來減少抽象類和接口之間的差異。
現在,我們可以為接口提供默認實現的方法了,並且不用強制子類來實現它。
接口和抽象類各有優缺點,在接口和抽象類的選擇上,必須遵守這樣一個原則:
行為模型應該總是通過接口而不是抽象類定義,所以通常是優先選用接口,儘量少用抽象類。
選擇抽象類的時候通常是如下情況:需要定義子類的行為,又要為子類提供通用的功能。
閱讀更多 會點代碼的鬍子大叔 的文章