??????? 在Java語言中,可以定義一種抽象類型,并且提供這種這一抽象類型的各種具體實現。實際上Java給我們提供不只是一種機制而是兩種讓我們可以做到這一點。它們是Java接口和Java抽象類。二者的區別如下:
?????? (1) 兩者最明顯的區別在于,Java抽象類可以提供部分方法的實現,而Java接口不能。這是Java抽象類的有點也是優勢。如果向一個抽象類加入一個新的具體的方法,那么所有的子類一下子就得到了這個新的具體的方法。如果向一個接口中加入一個新的方法,所有實現這個接口的類都不能全部成功的通過編譯,因為它們沒有實現這個新聲明的方法。這就是Java接口的一個缺點了。
?????? (2) 一個抽象類的實現只能由這個抽象類的子類給出,那么,這個實現出在抽象類所定義出的繼承的等級結構中,而由于Java語言限制多繼承,因此抽象類作為類型定義工具的效果就大打折扣了。反之,任何一個實現了Java接口所規定的方法的類都可以具有這個接口的類型,而一個類可以實現多個接口。這也是兩者最重要的區別之一。
????? (3) 從代碼重構的角度上看,將一個單獨的Java具體類重構為一個Java接口的實現是很容易的。我們只需要聲明一個接口,并將重要的方法添家到接口聲明中,然后在具體的類定義語句后加上一個何時的implments就OK了。而為一個已有的具體類添加一個抽象類作為抽象類型卻不是那么的容易了,因為這個具體類有可能已經有了一個超類,這樣以來,這個新定義的抽象類只好繼續向上移動,變成這個超類的超類,如此循環,最后這個新定義的抽象類必定處于整個等級類型結構的最上端,從而使得等級結構中的所有成員都受到影響。
????? (4)?Java接口是定義混合類型的理想工具。Mixin Type就是在一個類主類型之外的次類型。一個混合類表明一個類不僅具有主類型的行為,而且還具有其它的行為。比如Hashtabl類就具有多個類型。它的主類型為Map,這是一種Java聚集。而Cloneable接口則給出了一個次要類型,這個類型說明這個類是可以安全克隆的。同樣,Serializable也是一個次要類型,它表明這個類是可以串行化的。