網(wǎng)站開發(fā)實驗報告可行性分析簡單網(wǎng)站建設(shè)優(yōu)化推廣
多態(tài)
概念
-
多態(tài)是同一個對象,在不同時刻表現(xiàn)出來不同的形態(tài),稱之為多態(tài)。
- 例如:水,我們把水理解成為一個對象,而水會有不同的形態(tài),比如 液態(tài)水、冰塊、水蒸氣
-
多態(tài)的前提
- 有繼承/實現(xiàn)關(guān)系(繼承是類和類之間的關(guān)系,實現(xiàn)是類和接口直接的關(guān)系)
- 有方法重寫(繼承之后,要對方法進(jìn)行重寫)
- 有父類的引用指向子類的對象。例如:Animal a = new Cat();
-
多態(tài)成員的訪問特點(非常重要,一定得理解,請先看口訣,再結(jié)合圖片下方注意文字,和圖片理解)
-
口訣(父類是左邊,子類是右邊):
- 對于成員變量,編譯看左邊,執(zhí)行看左邊
- 對于成員方法,編譯看左邊,執(zhí)行看右邊
注意:
? ①:先解釋下口訣,編譯看左邊,也就是看左邊有無這個成員,有的話編譯才通過,我們可以看到圖片一和圖片二兩張都是因為左邊父類中無 爆紅的這個成員,所以報錯
? ②:對于成員變量,編譯看左邊(也就是看左邊父類中有無這個成員,有的話編譯通過),執(zhí)行看左邊(我們看第三張圖,可以看到最中運行的結(jié)果是左邊父類中的成員變量值)
? ③:對于成員方法,編譯看左邊(也就是看左邊父類中有無這個成員,有的話編譯通過),執(zhí)行看右邊(我們看第三張圖,可以看到最中運行的結(jié)果是右邊子類中的成員方法,因為方法重寫了)
-
多態(tài)的好處和弊端
-
好處:提高了程序的擴(kuò)展性,定義方法的時候,使用父類作為參數(shù),將來在使用的時候使用具體的子類參與操作
-
弊端:不能使用子類特有的功能(必須父類中有【回想口訣,只有編譯通過才行】)
多態(tài)的轉(zhuǎn)型
-
多態(tài)的弊端是,不能使用子類特有的功能,怎么辦呢?就提出我們多態(tài)的轉(zhuǎn)型。
類型 方向 向上轉(zhuǎn)型 從子到父 父類引用指向子類對象 Animal a = new Cat(); 向下轉(zhuǎn)型 從父到子 父類引用轉(zhuǎn)為子類對象 Cat b = (Cat)a 注意:向下轉(zhuǎn)型,有個前提,得是同一種對象
? Animal a = new Cat(); // a 是Animal類型,但是本質(zhì)是 貓
? Dog d = (Dog)a; // 很明顯這行就錯了,(Dog)a 相當(dāng)于強轉(zhuǎn),但是 貓怎么能轉(zhuǎn)成狗呢!
// 動物類 class Animal{public void show(){System.out.println("動物!");} } // 狗類 class Dog extends Animal{public void show(){System.out.println("狗!");}public void speak(){System.out.println("汪汪");} } // 貓類 class Cat extends Animal{public void show(){System.out.println("貓!");}public void eat(){System.out.println("小魚干");} }public class Test {public static void main(String[] args) {// 向上轉(zhuǎn)型Animal a = new Cat();Animal b = new Dog();// 調(diào)用方法(父類對象調(diào)用,多態(tài)的形式,記得口訣)a.show();b.show();// 編譯不通過,因此爆紅 /* a.speak();a.eat();*/// 向下轉(zhuǎn)型Cat c = (Cat)a;Dog d = (Dog)b;// 調(diào)用方法(子類對象調(diào)用)c.eat();c.show();d.speak();d.show();/* Cat c1 = (Cat)b;c1.speak();*/} }
-
多態(tài)很重要,一定要理解!!!
-
其他兩大特征可參考下面這兩篇文章:
-
面向?qū)ο蟮娜筇卣髦焕^承
-
面向?qū)ο蟮娜筇卣髦环庋b
-