本文講解java中抽象類別和介面的區別:1.語法層面的區別;2.設計層面上的區別。
1.語法層面上的差異
1)抽象類別可以提供成員方法的實作細節,而介面中只能存在public abstract 方法;
2)抽象類別中的成員變數可以是各種類型的,而介面中的成員變數只能是public static final類型的;
3)介面中不能含有靜態程式碼區塊以及靜態方法,而抽象類別可以有靜態程式碼區塊和靜態方法;
4)一個類別只能繼承一個抽象類,而一個類別卻可以實作多個介面。
2.設計層面上的區別
1)抽象類別是對一種事物的抽象,即對類別抽象,而介面是對行為的抽象。抽象類別是對整個類別整體進行抽象,包括屬性、行為,但是介面卻是對類別局部(行為)進行抽象化。舉個簡單的例子,飛機和鳥是不同類的事物,但是它們都有一個共通性,就是都會飛。那麼在設計的時候,可以將飛機設計為一個類Airplane,將鳥設計為一個類Bird,但是不能將飛行這個特性也設計為類,因此它只是一個行為特性,並不是對一類事物的抽象描述。此時可以將 飛行 設計為一個介面Fly,包含方法fly( ),然後Airplane和Bird分別依照自己的需求實作Fly這個介面。然後至於有不同種類的飛機,例如戰鬥機、民用飛機等直接繼承Airplane即可,對於鳥也是類似的,不同種類的鳥直接繼承Bird類即可。從這裡可以看出,繼承是一個 "是不是"的關係,而 介面 實作則是 "有沒有"的關係。如果一個類別繼承了某個抽象類,則子類別必定是抽象類別的種類,而介面實作則是有沒有、具備不具備的關係,例如鳥是否能飛(或是否具備飛行這個特點),能飛行則可以實作這個接口,不能飛行就不實作這個接口。
2)設計層面不同,抽象類別作為許多子類別的父類,它是一種模板式設計。而介面是一種行為規範,它是一種輻射式設計。什麼是模板式設計?最簡單例子,大家都用過ppt裡面的模板,如果用模板A設計了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它們的公共部分需要改動,則只需要改動模板A就可以了,不需要重新對ppt B和ppt C進行改動。而輻射式設計,例如某個電梯都裝了某種警報器,一旦要更新警報器,就必須全部更新。也就是說對於抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實現,子類可以不進行變更;而對於接口則不行,如果接口進行了變更,則所有實現這個接口的類別都必須進行相應的改動。
下面看一個網路上流傳最廣泛的例子:門和警報的例子:門都有open( )和close( )兩個動作,此時我們可以定義透過抽象類別和介面來定義這個抽象概念:
abstract class Door {
public abstract void open(); public abstract void close();
}
# 或:
interface Door {
public abstract void open(); public abstract void close();
}
# 但是現在如果我們需要閘具有警報alarm( )的功能,那麼該如何實現?以下提供兩種想法:
1)將這三個功能都放在抽象類別裡面,但是這樣一來所有繼承於這個抽象類別的子類別都具備了警報功能,但是有的門並不一定具備警報功能;
2)將這三個功能都放在介面裡面,需要用到警報功能的類別就需要實作這個介面中的open( )和close( ),也許這個類根本就不具備open( )和close( )這兩個功能,例如火災警報器。
從這裡可以看出, Door的open() 、close()和alarm()根本就屬於兩個不同範疇內的行為,open()和close()屬於門本身固有的行為特性,而alarm()屬於延伸的附加行為。因此最好的解決辦法是單獨將警報設計為一個接口,包含alarm()行為,Door設計為單獨的一個抽象類,包含open和close兩種行為。再設計一個警報門繼承Door類別和實作Alarm介面。
interface Alram {
void alarm();
}
abstract class Door {
void open(); void close();
}
class AlarmDoor extends Door implements Alarm {
void oepn() { //.... } void close() { //.... } void alarm() { //.... }
}
相關文章:
相關影片:
#以上是java中抽象類別和介面在語法、設計層面上的區別的詳細內容。更多資訊請關注PHP中文網其他相關文章!