|
好程序員Java教程今日分享實(shí)用的大數(shù)據(jù)之對象的轉(zhuǎn)型 > 體現(xiàn): > > 1. 父類的引用可以指向子類的對象 > 2. 接口的引用可以指向?qū)崿F(xiàn)類的對象 > 轉(zhuǎn)型: > > 1. 向上轉(zhuǎn)型 > 1. 由子類類型轉(zhuǎn)型為父類類型,或者由實(shí)現(xiàn)類類型轉(zhuǎn)型為接口類型 > 2. 向上轉(zhuǎn)型一定會成功,是一個隱式轉(zhuǎn)換 > 3. 向上轉(zhuǎn)型后的對象,將只能訪問父類或者接口中的成員 > 2. 向下轉(zhuǎn)型 > 1. 由父類類型轉(zhuǎn)型為子類類型,或者由接口類型轉(zhuǎn)型為實(shí)現(xiàn)類類型 > 2. 向下轉(zhuǎn)型可能會失敗,是一個顯式轉(zhuǎn)換 > 3. 向下轉(zhuǎn)型后的對象,將可以訪問子類或者實(shí)現(xiàn)類中特有的成員 ####instanceof關(guān)鍵字 > 1. 針對于向下轉(zhuǎn)型的。 > > 1. 如果向下轉(zhuǎn)型不成功,會怎樣? > > 1. 會有一個異常 ClassCastException > > 2. 如何避免這種情況? > > 1. 在向下轉(zhuǎn)型之前,我們先判斷一下這個對象是不是要轉(zhuǎn)型的類型 > > 2. 怎么判斷? > > 1. 關(guān)鍵字 **instanceof** > > ```java > Animal animal = new Dog(); > if (animal instanceof Dog) { > // 說明animal的確是一個Dog > } > ``` > 如果一個類中重寫了父類的某一個方法。此時: > > 1. 如果用這個類的對象來調(diào)用這個方法,最終執(zhí)行的是子類的實(shí)現(xiàn)。 > 2. 如果用向上轉(zhuǎn)型后的對象來調(diào)用這個方法,執(zhí)行的依然是子類的實(shí)現(xiàn)。 > 1. 因?yàn)橄蛏限D(zhuǎn)型后的對象,歸根到底還是子類對象。 #### 抽象類與抽象方法 > 抽象:**abstract** > > > > 抽象類: > > 用關(guān)鍵字abstract修飾的類,就是抽象類 > > 抽象方法: > > 用關(guān)鍵字abstract修飾的方法,就是抽象方法 > 特點(diǎn): > > 抽象方法: > > 1. 抽象方法使用abstract來修飾,只有聲明,沒有實(shí)現(xiàn)。 > > ```java > public abstract void bark(); > ``` > > 2. 抽象方法,只能夠?qū)懺诔橄箢愔小?/span> > > 抽象類: > > 1. 抽象類使用abstract來修飾,抽象類不能實(shí)例化對象。 > 2. 抽象類中是可以寫非靜態(tài)的成員的,這時候這些非靜態(tài)成員是可以繼承給子類的。 > 3. 抽象類中是可以包含構(gòu)造方法的。 > > 結(jié)合抽象類和抽象方法: > > 1. 非抽象子類在繼承一個抽象父類的同時,要實(shí)現(xiàn)父類中所有的抽象方法。 > 注意事項(xiàng): > > **final**關(guān)鍵字 > > 1. 抽象類可以用final來修飾嗎? > 1. 不能!因?yàn)?/span>final表示這個類無法被繼承。但是對于抽象類來說,如果無法被繼承,則這個抽象類沒有任何意義。 > 2. 抽象方法可以用final修飾嗎? > 1. 不能!因?yàn)?/span>final修飾的方法無法被重寫。但是抽象方法又只能寫在抽象類中。如果一個抽象方法用final來修飾了,此時這個方法將無法被非抽象子類重寫,那這個子類就會有問題。 > 抽象類和抽象方法的實(shí)用場景: > > 可以用抽象類和抽象方法來實(shí)現(xiàn)一些簡單規(guī)則的制定。 > > 例如:所有的快遞公司都必須要會xxxxx。KFC、麥當(dāng)勞、 > > 如果僅僅用抽象類和抽象方法來進(jìn)行規(guī)則指定、行為約束: > > 弊端:因?yàn)?/span>Java是單繼承的語言,如果一個類為了遵循某一種規(guī)范,而去繼承一個抽象類,此時這個類將無法再繼承其他類。 > > 為了解決這樣的問題,我么可以使用接口進(jìn)行行為約束,規(guī)范代碼。 #### 接口 > 關(guān)鍵字:**interface** > > > > 語法: > > 和類是比較像的,但是他不是類 > > ```java > [訪問權(quán)限修飾符] interface 接口名字 { > // 接口中的成員 > } > ``` > > 1. 訪問權(quán)限修飾符:和類一樣,只能有 public 和默認(rèn)的default權(quán)限。 > 2. 接口不是類,不能實(shí)例化對象。 > 3. 接口,暫時和類寫成平級的關(guān)系。 > 4. 接口名字是一個標(biāo)識符,遵循大駝峰命名法 > 接口中成員的定義: > > 1. 屬性:接口中的屬性,默認(rèn)的修飾符是 **public static final** > 2. 構(gòu)造方法:接口中不能寫構(gòu)造方法 > 3. 方法: > 1. 接口中的方法都是抽象方法 > 2. 接口中的方法訪問權(quán)限修飾符都是public > 接口是需要被類來實(shí)現(xiàn)的。 > > 實(shí)現(xiàn)接口關(guān)鍵字: **implements** > > 讓類實(shí)現(xiàn)接口: > > ```java > public class Shunfeng extends Company implements Express { > > } > ``` > > 1. 一個非抽象類在實(shí)現(xiàn)接口后,需要實(shí)現(xiàn)接口中所有的抽象方法。 > > 2. 一個類在繼承自一個父類后,還可以再去實(shí)現(xiàn)接口。 > > 1. 如果同時有父類和接口,那么繼承父類在前,實(shí)現(xiàn)接口在后 > > 3. 一個類可以實(shí)現(xiàn)多個接口 > > 1. 如果一個類實(shí)現(xiàn)的多個接口中有相同的方法,這個方法在實(shí)現(xiàn)類中只需要實(shí)現(xiàn)一次即可。 > > 4. 接口之間是有繼承關(guān)系的,而且接口之間的繼承是多繼承。 > > ```java > public interface GrilFriend extends HouseKeeping, Takecare { > > } > ``` |
|
|