抽象類(lèi)和接口三
8.9.3 抽象類(lèi)和接口的比較
抽象類(lèi)和接口都是進(jìn)行面向對象設計時(shí)專(zhuān)用的設計結構,在實(shí)際進(jìn)行項目設計時(shí),經(jīng)常需要考慮的問(wèn)題就是——“使用抽象類(lèi)還是接口”?下面通過(guò)對于抽象類(lèi)和接口進(jìn)行簡(jiǎn)單的比較,熟悉兩者之間的區別和聯(lián)系,從而在實(shí)際設計時(shí)使用恰當的結構。
1. 什么時(shí)候使用抽象類(lèi)或接口?
當設計中為了規范類(lèi)中方法聲明的結構(即類(lèi)的行為)時(shí),使用抽象類(lèi)或接口。也就是強制子類(lèi)對外部提供統一的方法聲明時(shí),使用抽象類(lèi)或接口。
2. 抽象類(lèi)和接口的區別(不同點(diǎn))
a)抽象類(lèi)是類(lèi),而接口是接口。
因為抽象類(lèi)是一個(gè)類(lèi),所以類(lèi)內部可以包含的內容(構造方法、方法和屬性等)在抽象類(lèi)內部都可以存在,當然抽象類(lèi)也受到類(lèi)的單重繼承的限制。而接口是接口類(lèi)型,所以接口內部只能包含常量屬性和抽象方法,但是一個(gè)類(lèi)可以實(shí)現多個(gè)接口,所以接口不受類(lèi)的單重繼承的限制。
b)抽象類(lèi)內部可以包含實(shí)體方法,而接口不能
抽象類(lèi)是一個(gè)類(lèi),所以在抽象類(lèi)內部既可以包含抽象方法也可以包含實(shí)體方法,而接口內部的每個(gè)方法都必須是抽象方法。
c)抽象類(lèi)可以繼承類(lèi),而接口不能
抽象類(lèi)是一個(gè)類(lèi),所以在設計時(shí)可以使抽象類(lèi)繼承其它的類(lèi),在已有類(lèi)的基礎上進(jìn)行設計,但是接口不能繼承類(lèi)。
3. 抽象類(lèi)和接口的聯(lián)系(相同點(diǎn))
a)抽象類(lèi)和接口都可以聲明對象,但是都只能使用子類(lèi)的構造方法進(jìn)行創(chuàng )建。
b)抽象類(lèi)和接口內部都可以包含抽象方法。
按照Java語(yǔ)言的語(yǔ)法,子類(lèi)在繼承抽象類(lèi)或實(shí)現接口時(shí),都必須覆蓋這些抽象方法,否則必須聲明為抽象類(lèi)。
c)抽象類(lèi)和接口都可以代表一種類(lèi)型,從而可以統一子類(lèi)對象的類(lèi)型,獲得良好的可擴展性。
4. 什么時(shí)候使用抽象類(lèi)?
當滿(mǎn)足以下的條件時(shí),最好使用抽象類(lèi)進(jìn)行設計:
a)子類(lèi)不繼承其它父類(lèi)
b)子類(lèi)中存在完全相同的功能實(shí)現的方法
c)子類(lèi)中存在相同的屬性
d)設計出的結構需要繼承其它類(lèi)
當需要滿(mǎn)足d條件時(shí),只能使用抽象類(lèi),否則也可以考慮使用接口實(shí)現。
5. 什么時(shí)候使用接口?
當滿(mǎn)足以下的條件時(shí),最好使用接口進(jìn)行設計:
a)子類(lèi)已經(jīng)繼承了其它父類(lèi)
b)子類(lèi)中不存在完全相同的功能實(shí)現方法
c)子類(lèi)中不存在相同的屬性
d)設計出的結構不需要繼承其它類(lèi)
當需要滿(mǎn)足a條件時(shí),只能使用接口,否則也可以考慮使用抽象類(lèi)實(shí)現。
6. 抽象類(lèi)和接口的其它用途
a)禁止創(chuàng )建該類(lèi)的對象時(shí),可以把該類(lèi)聲明為抽象類(lèi)。
b)當需要存儲大量的常量數據,而這些常量數據將會(huì )在項目中的多個(gè)類(lèi)之間使用時(shí),可以使用接口。
c)當需要統一具有某種功能的類(lèi)的對象時(shí),可以使用接口。例如Serializable接口。
當然,只有經(jīng)過(guò)大量的系統設計訓練以后,才可以更加深刻的理解抽象類(lèi)和接口的區別和聯(lián)系,從而更加自如的進(jìn)行選擇。
另外,需要說(shuō)明的是,不是每個(gè)項目中都必須使用抽象類(lèi)或接口的。
聯(lián)系客服