面向?qū)ο骭4

抽象類

在繼承過程中,繼承關(guān)系形成一個金字塔,位于金字塔底部的類越來越具體,而位于金字塔頂部的類越來越抽象。

當(dāng)一個類的方法過于抽象,不確定如何實(shí)現(xiàn),此時可以把該方法定義為抽象方法。

抽象方法所在的類過與抽象,稱為抽象類(abstract class)。

形式? ?修飾符 abstract class 類名{

}

抽象類的特性

抽象類過于抽象,實(shí)例化無語義=>不能被實(shí)例化? //無法new

當(dāng)一個方法過于抽象,需要將該方法聲明為抽象方法? ? ?//public abstract void 方法名();

抽象方法一定位于抽象類中;抽象方法沒有方法體;抽象類中的方法不一定全是抽象方法

子類繼承抽象類,子類非抽象類時,一定要重寫抽象類的方法,將其實(shí)現(xiàn)

實(shí)現(xiàn) (implement): 實(shí)現(xiàn)建立在重寫的繼承上,是一種特殊的重寫

Final關(guān)鍵字

用于修飾局部變量,屬性,方法,類,表示最終的意思。

修飾類時,無法被繼承;修飾方法,方法不能被重寫;

修飾屬性可與static搭配使用,形成靜態(tài)常量;public static final String ABC="abc";

修飾基本數(shù)據(jù)類型,表示該值不能被改變

修飾引用數(shù)據(jù)類型,表示該地址不能被概念

多態(tài)(polymorphic)


多態(tài)可以減少類中代碼量,可以提高代碼的可擴(kuò)展性和可維護(hù)性

在程序中,同一引用類型(一般指父類),使用不同實(shí)例而執(zhí)行結(jié)果不同的,稱為多態(tài)。

多態(tài)的存在要有3個必要條件:

1.要有繼承????????2.要有方法重寫????????????3.父類引用指向子類對象

實(shí)現(xiàn)多態(tài)的步驟:

1.編寫父類

2.編寫子類,子類一定要重寫/實(shí)現(xiàn)父類的方法

3.運(yùn)行時,父類類型引用子類對象? ?//父類 a=new 子類();


public class Test01 {

??? public static void main(String[] args) {

??????? // 同一引用類型

??????? Petpet = null;

??????? // 父類引用 引用 子類對象

??????? pet = new Dog("二狗",100,0,"土狗");

??????? // 呈現(xiàn)多態(tài)

??????? pet.eat();


??????? pet = new Penguin("大腳", 90, 50, Penguin.SEX_FEMALE);

??????? // 呈現(xiàn)多態(tài)

??????? pet.eat();

??? }

}

多態(tài)的實(shí)現(xiàn)形式

1.父類類型引用子類對象(本質(zhì))

2.父類作為方法形參實(shí)現(xiàn)? ? ? ?

public void feed(Pet pet) {

}

3.父類作為方法的返回值? ? ? ?

public?Pet?feed(int a) {

}


類型轉(zhuǎn)換

在多態(tài)中有兩種類型轉(zhuǎn)換

1.自動類型轉(zhuǎn)換(向上類型轉(zhuǎn)換)??

子類可以自動轉(zhuǎn)換成父類? ?//父類?引用=null; 引用=new 子類();? Pet pet = null;? pet= new Dog();

2.強(qiáng)制類型轉(zhuǎn)換(向下類型轉(zhuǎn)換)? //子類類型 引用 =(子類)父類對象? Dog dog =(Dog) pet;

需要判斷父類對象的真實(shí)類型,可用instanceof關(guān)鍵字?

如 obj instanceOf 類/接口? ? ?判斷obj是否是類/接口的實(shí)例

如果調(diào)用子類特有的方法,一定要強(qiáng)制類型轉(zhuǎn)換。

public void play(Pet pet) {

???????? if (pet instanceof Dog) {

????????????? Dog dog = (Dog) pet;

????????????? dog.catchFlyDisc();

???????? }else if (pet instanceof Penguin){

????????????? Penguinpenguin = (Penguin) pet;

????????????? penguin.swimming();

???????? }

???? }

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。