抽象類是用來捕捉子類的通用特性的。接口是抽象方法的集合。
從設(shè)計(jì)層面來說,抽象類是對(duì)類的抽象,是一種模板設(shè)計(jì),接口是行為的抽象,是一種行為的規(guī)范。
相同點(diǎn)
接口和抽象類都不能實(shí)例化都位于繼承的頂端,用于被其他實(shí)現(xiàn)或繼承都包含抽象方法,其子類都必須覆寫這些抽象方法
不同點(diǎn)
備注:Java8中接口中引入默認(rèn)方法和靜態(tài)方法,以此來減少抽象類和接口之間的差異。
現(xiàn)在,我們可以為接口提供默認(rèn)實(shí)現(xiàn)的方法了,并且不用強(qiáng)制子類來實(shí)現(xiàn)它。
接口和抽象類各有優(yōu)缺點(diǎn),在接口和抽象類的選擇上,必須遵守這樣一個(gè)原則:
行為模型應(yīng)該總是通過接口而不是抽象類定義,所以通常是優(yōu)先選用接口,盡量少用抽象類。選擇抽象類的時(shí)候通常是如下情況:需要定義子類的行為,又要為子類提供通用的功能。