深入理解Java中的介面與抽象類

2021-09-12 13:20:59 字數 4313 閱讀 3239

一、抽象類

抽象方法:只宣告而未實現的方法,即沒有方法體

public abstract void getmessage();//抽象方法
抽象類:普通類的超集,只是比普通類多了一些抽象方法而已

所有抽象方法要求使用abstract關鍵字來定義,並且抽象方法所在的類也一定要使用abstract關鍵字來 定義,表示抽象類

abstract class  person
需要注意的地方:

1.抽象類不能被例項化

抽象類中包含抽象方法,抽象方法無方法體,沒有具體實現,所以抽象類不能直接產生例項化物件;

2.抽象類中不一定包含抽象方法

使用abstract關鍵字修飾的類中,如果不包含抽象方法,也是抽象類,此時仍然不能例項化

3.如果乙個類繼承於乙個抽象類,則子類必須實現父類的所有抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類;

4.private和abstract不能同時使用

被private修飾的方法不能被覆寫,而抽象方法必須被覆寫(類不能用private修飾),由此可知,抽象類不能被final修飾

5.抽象類無法直接產生例項化物件,但可以通過子類向上轉型進行例項化

abstract class person

class student extends person

}public class test

}

6.抽象類是普通類的超集,只是比普通類多了一些抽象方法而已,因此抽象類也可以有構造方法,例項化子類時一定要先呼叫父類的構造方法

abstract class a

public abstract void print() ;//抽象方法

}class b extends a

public void print()

}public class test

}

二、介面

介面:抽象方法和全域性常量的集合,使用inte***ce關鍵字定義

inte***ce imessage
實現介面:使用implements關鍵字

class message implements imessage  

}

需要注意的地方:

1.介面中的變數會被隱式地指定為public static final變數,方法會被隱式地指定為public abstract方法,所以為了**簡潔,這些修飾詞可以省略不寫,如果要寫的話,也強制要求使用public許可權(包括方法和屬性)

inte***ce imessage

class messageimpl implements imessage

}

2.乙個子類可以實現多個介面【實現多繼承的概念

3.介面的子類必須覆寫介面中的全部抽象方法,如果該子類是抽象類,可以不覆寫抽象方法,隨後可以利用子類的向上轉型通過例項化子類來得到介面的例項化物件

4.當乙個子類即需要實現介面又需要繼承抽象類時,先使用extends繼承乙個抽象類,而後使用implements實現多個介面

5.乙個介面可以使用extends繼承多個父介面(使用implements實現介面需要覆寫抽象方法,但是繼承不需要實現抽象方法,繼承抽象類,需要實現抽象方法,介面不是抽象類)

三、介面與抽象類的相同點

介面與抽象類都不能被例項化

介面和抽象類都可以包含抽象方法,實現介面或繼承抽象類時強制要求子類實現這些抽象方法

四、介面與抽象類的區別

no

區別抽象類(abstract)

介面(inte***ce)

1結構組成

普通類+抽象方法

全域性常量+抽象方法

2抽象方法許可權

各種許可權

public

3子類使用

使用implements關鍵字實現介面

4子類限制

乙個子類只能繼承乙個抽象類

乙個子類可以實現多個介面

5static

可以有靜態**塊和靜態方法

不能含有靜態**塊以及靜態方法

6設計模式

模板設計

工廠設計、**設計

設計層面的區別:

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
或者是:

inte***ce door
但是現在如果我們需要門具有報警alarm( )的功能,那麼該如何實現?下面提供兩種思路:

1)將這三個功能都放在抽象類裡面,但是這樣一來所有繼承於這個抽象類的子類都具備了報警功能,但是有的門並不一定具備報警功能;

2)將這三個功能都放在介面裡面,需要用到報警功能的類就需要實現這個介面中的open( )和close( ),也許這個類根本就不具備open( )和close( )這兩個功能,比如火災報警器。

從這裡可以看出, door的open() 、close()和alarm()根本就屬於兩個不同範疇內的行為,open()和close()屬於門本身固有的行為特性,而alarm()屬於延伸的附加行為。因此最好的解決辦法是單獨將報警設計為乙個介面,包含alarm()行為,door設計為單獨的乙個抽象類,包含open和close兩種行為。再設計乙個報警門繼承door類和實現alarm介面。

inte***ce alram 

abstract class door

class alarmdoor extends door implements alarm

void close()

void alarm()

}

五、介面與抽象類的關係

1.抽象類可以使用implements實現多個介面

乙個子類可以實現多個介面, 抽象類是普通類的超集,因此乙個抽象類也可以實現多個介面

inte***ce imessage 

abstract class news implements imessage

class messageimpl extends news

public void getnews()

}public class test

}

2.介面不能繼承抽象類

繼承乙個抽象類就要實現它的抽象方法,介面不能實現抽象方法,所以不能繼承抽象類

深入理解java抽象與介面

1,abstract 修飾類 抽象類 2,abstract 修飾方法 抽象方法 3,抽象方法只有宣告,而沒有具體的方法實現部分 注意 抽象類中的抽象方法,強制其子類重寫抽象方法 抽象類不能建立物件,因為其含有無具體實現的方法 抽象類建立物件的方式可仿照多型 抽象類中不一定有抽象方法,但抽象方法一定在...

JAVA中的介面和抽象類深入理解

抽象類往往用來表徵我們在對問題領域進行分析 設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象,我們不能把它們例項化 拿不出乙個具體的東西 所以稱之為抽象。比如 我們要描述 水果 它就是乙個抽象,它有質量 體積等一些共性 水果有質量 但又缺乏特性 蘋果 橘子都是水果,它們有自...

深入理解Java的介面和抽象類

一 抽象類 二 介面 三 抽象類和介面的區別 抽象方法 它只有宣告,沒有具體的實現。抽象方法的宣告格式為 abstract void fun 抽象方法必須用 abstract 關鍵字來修飾,如果乙個類含有抽象方法,則稱這個類為抽象類,抽象類必須在類前用abstract關鍵字來修飾。因為抽象類中沒有具...