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