抽象類
在繼承過程中,繼承關(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();
???????? }
???? }