1.抽象類
??(1)有抽象方法的類被定義為抽象類,但抽象類可以沒有抽象方法钠右。
??(2)抽象方法不能實例化邪意,無法使用new關(guān)鍵字創(chuàng)建對象。
??(3)抽象類有構(gòu)造器丽蝎,但主要用于被其子類調(diào)用猎拨。
??子類繼承父類(抽象類)要求子類一定要實現(xiàn)抽象方法
2.接口
??(1)接口是特殊的“抽象類”,抽象的更徹底屠阻。
??(2)接口也不能實例化红省。
??(3)普通類必須實現(xiàn)接口,抽象類可以實現(xiàn)也可以不實現(xiàn)国觉。
抽象類和接口的異同點
相同點:
??(1)都不能被實例化吧恃,都位于繼承樹的頂端,用于被其他類實現(xiàn)或繼承麻诀;
??(2)接口和抽象類都可以包含抽象方法痕寓,實現(xiàn)接口或繼承抽象類的普通子類都必須實現(xiàn)這些抽象方法。
不同點 :
??(1)抽象類使用abstract聲明蝇闭,接口使用interface聲明呻率;
??(2)抽象類中的方法可以有方法體(就是具體的功能實現(xiàn)),接口中的方法沒有方法體呻引;
??(3)抽象類中的成員變量可以是各種類型的礼仗,接口中的成員變量只能是public static final;
??(4)抽象類中可以含有靜態(tài)代碼塊及靜態(tài)方法,接口中不能含有苞七;
??(5)一個類只能繼承一個抽象類藐守,但可以實現(xiàn)多個接口;
??(6)抽象類是自下向上的一種抽象蹂风,接口是自上向下的一種行為準則卢厂,是一種規(guī)范。
舉例
?? Map惠啄、AbstractMap與HashMap
?? ??Map是一個接口慎恒,AbstractMap實現(xiàn)了Map這個接口,而HashMap實現(xiàn)了Map接口并且繼承了Abstract類撵渡。
public interface Map<K,V>
public abstract class AbstractMap<K,V> implements Map<K,V>
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>
??看源碼融柬,我們可以知道AbstractMap實現(xiàn)了Map接口中的所有方法,并且在類中沒有抽象方法趋距,那HashMap為什么還要實現(xiàn)Map這個接口呢粒氧?
??這就印證了接口是自上向下的行為規(guī)范,抽象類是自下向上的一種抽象节腐。將實現(xiàn)Map接口的HashMap,TreeMap等向上抽象為AbstractMap,這樣可以提高代碼的復(fù)用性外盯,便于擴展與維護摘盆。所以,這就是為什么HashMap既繼承了AbstractMap,又實現(xiàn)了Map接口饱苟。