2.0 接口、多態(tài)

第一章 接口
1.1 概述

接口,是Java語言中一種引用類型,是方法的集合,如果說類的內(nèi)部封裝了成員變量、構(gòu)造方法和成員方法,那么接口的內(nèi)部主要就是封裝了方法,包含抽象方法(JDK 7及以前),默認方法和靜態(tài)方法(JDK 8),私有方法(JDK 9)。接口的定義,它與定義類方式相似,但是使用? interface 關(guān)鍵字。它也會被編譯成.class文件,但一定要明確它并不是類,而是另外一種引用數(shù)據(jù)類型。

引用數(shù)據(jù)類型:數(shù)組,類,接口。

接口的使用,它不能創(chuàng)建對象,但是可以被實現(xiàn)( implements ,類似于被繼承)。一個實現(xiàn)接口的類(可以看做是接口的子類),需要實現(xiàn)接口中所有的抽象方法,創(chuàng)建該類對象,就可以調(diào)用方法了,否則它必須是一個抽象類。

1.2? 定義格式

含有抽象方法

抽象方法:使用 abstract 關(guān)鍵字修飾,可以省略,沒有方法體。該方法供子類實現(xiàn)使用。

含有默認方法和靜態(tài)方法

默認方法:使用? default 修飾,不可省略,供子類調(diào)用或者子類重寫。

靜態(tài)方法:使用? static 修飾,供接口直接調(diào)用。

含有私有方法和私有靜態(tài)方法

私有方法:使用? private 修飾,供接口中的默認方法或者靜態(tài)方法調(diào)用。

代碼如下:

1.3 基本的實現(xiàn)

實現(xiàn)的概述

類與接口的關(guān)系為實現(xiàn)關(guān)系,即類實現(xiàn)接口,該類可以稱為接口的實現(xiàn)類,也可以稱為接口的子類。實現(xiàn)的動作類似繼承,格式相仿,只是關(guān)鍵字不同,實現(xiàn)使用? implements 關(guān)鍵字。

非抽象子類實現(xiàn)接口:

????????1. 必須重寫接口中所有抽象方法。

????????2. 繼承了接口的默認方法,即可以直接調(diào)用,也可以重寫。

抽象方法的使用

必須全部實現(xiàn),代碼如下:

定義接口:

定義實現(xiàn)類:

默認方法的使用

可以繼承,可以重寫,二選一,但是只能通過實現(xiàn)類的對象來調(diào)用。

1. 繼承默認方法,代碼如下:

2. 重寫默認方法,代碼如下:

靜態(tài)方法的使用

靜態(tài)與.class 文件相關(guān),只能使用接口名調(diào)用,不可以通過實現(xiàn)類的類名或者實現(xiàn)類的對象調(diào)用

代碼如下:

定義接口:

私有方法的使用

私有方法:只有默認方法可以調(diào)用。

私有靜態(tài)方法:默認方法和靜態(tài)方法可以調(diào)用。

如果一個接口中有多個默認方法,并且方法中有重復的內(nèi)容,那么可以抽取出來,封裝到私有方法中,供默認方法去調(diào)用。從設計的角度講,私有的方法是對默認方法和靜態(tài)方法的輔助

1.4 接口的多實現(xiàn)

之前學過,在繼承體系中,一個類只能繼承一個父類。而對于接口而言,一個類是可以實現(xiàn)多個接口的,這叫做接口的多實現(xiàn)。并且,一個類能繼承一個父類,同時實現(xiàn)多個接口。

實現(xiàn)格式:

[ ]: 表示可選操作。

抽象方法

接口中,有多個抽象方法時,實現(xiàn)類必須重寫所有抽象方法。如果抽象方法有重名的,只需要重寫一次。代碼如下:

定義多個接口:

默認方法

接口中,有多個默認方法時,實現(xiàn)類都可繼承使用。如果默認方法有重名的,必須重寫一次。代碼如下:

定義多個接口:

靜態(tài)方法

接口中,存在同名的靜態(tài)方法并不會沖突,原因是只能通過各自接口名訪問靜態(tài)方法。

優(yōu)先級的問題

當一個類,既繼承一個父類,又實現(xiàn)若干個接口時,父類中的成員方法與接口中的默認方法重名,子類就近選擇執(zhí)行父類的成員方法。代碼如下:

定義接口:

1.5 接口的多繼承【了解】

一個接口能繼承另一個或者多個接口,這和類之間的繼承比較相似。接口的繼承使用? extends 關(guān)鍵字,子接口繼承父接口的方法。如果父接口中的默認方法有重名的,那么子接口需要重寫一次。代碼如下:

定義父接口:

小貼士: 子接口重寫默認方法時,default關(guān)鍵字可以保留。 子類重寫默認方法時,default關(guān)鍵字不可以保留。

1.6 其他成員特點

接口中,無法定義成員變量,但是可以定義常量,其值不可以改變,默認使用 public static final修飾。

接口中,沒有構(gòu)造方法,不能創(chuàng)建對象。

接口中,沒有靜態(tài)代碼塊。

第二章 多態(tài)

2.1 概述

引入

多態(tài)是繼封裝、繼承之后,面向?qū)ο蟮牡谌筇匦浴?/p>

生活中,比如跑的動作,小貓、小狗和大象,跑起來是不一樣的。再比如飛的動作,昆蟲、鳥類和飛機,飛起來也是不一樣的。可見,同一行為,通過不同的事物,可以體現(xiàn)出來的不同的形態(tài)。多態(tài),描述的就是這樣的狀態(tài)。

定義

多態(tài) : 是指同一行為,具有多個不同表現(xiàn)形式。

前提【重點】

1 . 繼承或者實現(xiàn)【二選一】

2. 方法的重寫【意義體現(xiàn):不重寫,無意義】

3. 父類引用指向子類對象【格式體現(xiàn)】

2.2 多態(tài)的體現(xiàn)

多態(tài)體現(xiàn)的格式:

父類類型:指子類對象繼承的父類類型,或者實現(xiàn)的父接口類型。

當使用多態(tài)方式調(diào)用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,執(zhí)行的是子類重寫后方法。

2.3 多態(tài)的好處

實際開發(fā)的過程中,父類類型作為方法形式參數(shù),傳遞子類對象給方法,進行方法的調(diào)用,更能體現(xiàn)出多態(tài)的擴展

性與便利。代碼如下:

由于多態(tài)特性的支持, showAnimalEat方法的Animal類型,是Cat和Dog的父類類型,父類類型接收子類對象,當然可以把Cat對象和Dog對象,傳遞給方法。

當eat方法執(zhí)行時,多態(tài)規(guī)定,執(zhí)行的是子類重寫的方法,那么效果自然與showCatEat、showDogEat方法一致,所以showAnimalEat完全可以替代以上兩方法。

不僅僅是替代,在擴展性方面,無論之后再多的子類出現(xiàn),我們都不需要編寫showXxxEat方法了,直接使用showAnimalEat都可以完成。

所以,多態(tài)的好處,體現(xiàn)在,可以使程序編寫的更簡單,并有良好的擴展。

2.4 引用類型轉(zhuǎn)換

多態(tài)的轉(zhuǎn)型分為向上轉(zhuǎn)型與向下轉(zhuǎn)型兩種:

向上轉(zhuǎn)型

向上轉(zhuǎn)型 :多態(tài)本身是子類類型向父類類型向上轉(zhuǎn)換的過程,這個過程是默認的。

當父類引用指向一個子類對象時,便是向上轉(zhuǎn)型。

使用格式:

向下轉(zhuǎn)型

向下轉(zhuǎn)型 :父類類型向子類類型向下轉(zhuǎn)換的過程,這個過程是強制的。

一個已經(jīng)向上轉(zhuǎn)型的子類對象,將父類引用轉(zhuǎn)為子類引用,可以使用強制類型轉(zhuǎn)換的格式,便是向下轉(zhuǎn)型。

為什么要轉(zhuǎn)型

當使用多態(tài)方式調(diào)用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤。也就是說,不能調(diào)用子類擁有,而父類沒有的方法。編譯都錯誤,更別說運行了。這也是多態(tài)給我們帶來的一點"小麻煩"。所以,想要調(diào)用子類特有的方法,必須做向下轉(zhuǎn)型。

轉(zhuǎn)型的異常

轉(zhuǎn)型的過程中,一不小心就會遇到這樣的問題,請看如下代碼:

這段代碼可以通過編譯,但是運行時,卻報出了 ClassCastException ,類型轉(zhuǎn)換異常!這是因為,明明創(chuàng)建了Cat類型對象,運行時,當然不能轉(zhuǎn)換成Dog對象的。這兩個類型并沒有任何繼承關(guān)系,不符合類型轉(zhuǎn)換的定義。

為了避免ClassCastException的發(fā)生,Java提供了? instanceof 關(guān)鍵字,給引用變量做類型的校驗,格式如下:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容