“接口和內(nèi)部類為我們提供了一種將接口與實現(xiàn)分離的更加結(jié)構(gòu)化的方法。”
一、抽象類和抽象方法
Java提供一個叫做抽象方法的機制,這種方法是不完整的;僅有聲明而沒有方法體。下面是抽象方法聲明所采用的語法:
abstract void f();
包含抽象方法的類叫做抽象類。如果一個類包含一個或多個抽象方法,該類必須被限定為抽象的。
如果從一個抽象類繼承,并想創(chuàng)建該新類的對象,那么就必須為基類中的所有抽象方法提供方法定義。如果不這樣做,那么導出類便也是抽象類,且編譯器將會強制我們用abstract關鍵字來限定這個類。
二、接口
interface關鍵字使抽象的概念更向前邁進了一步。abstract關鍵字允許人們在類中創(chuàng)建一個或多個沒有任何定義的方法——提供了接口部分,但是沒有提供任何相應的具體實現(xiàn),這些實現(xiàn)由此類的繼承者創(chuàng)建。interface這個關鍵字產(chǎn)生一個完全抽象的類,它根本就沒有提供任何具體實現(xiàn)。
一個接口表示:“所有實現(xiàn)了特定接口的類看起來都像這樣”。
要讓一個類遵循某個特定接口(或者是一組接口),需要使用implements關鍵字,它表示:“interface只是它的外貌,但是現(xiàn)在我要聲明它是如何工作的。”
抽象類與接口的比較:
1、Java接口和Java抽象類最大的一個區(qū)別,就在于Java抽象類可以提供某些方法的部分實現(xiàn),而Java接口不可以,這大概就是Java抽象類唯一的優(yōu)點吧,但這個優(yōu)點非常有用。如果向一個抽象類里加入一個新的具體方法時,那么它所有的子類都一下子都得到了這個新方法,而Java接口做不到這一點,如果向一個Java接口里加入一個新方法,所有實現(xiàn)這個接口的類就無法成功通過編譯了,因為你必須讓每一個類都再實現(xiàn)這個方法才行,這顯然是Java接口的缺點。
2、一個抽象類的實現(xiàn)只能由這個抽象類的子類給出,也就是說,這個實現(xiàn)處在抽象類所定義出的繼承的等級結(jié)構(gòu)中,而由于Java語言的單繼承性,所以抽象類作為類型定義工具的效能大打折扣。在這一點上,Java接口的優(yōu)勢就出來了,任何一個實現(xiàn)了一個Java接口所規(guī)定的方法的類都可以具有這個接口的類型,而一個類可以實現(xiàn)任意多個Java接口,從而這個類就有了多種類型。
3、從第2點不難看出,Java接口是定義混合類型的理想工具,混合類表明一個類不僅僅具有某個主類型的行為,而且具有其他的次要行為。
三、完全解耦
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。