同一行為,通過不同的事物,可以體現出來的不同的形態。多態描述的就是這樣的狀態。 定義:是指同一行為,具有多個不同表現形式。 多態的前提 1. 繼承或者實現【二選一】 2. 方法的重寫【意義體現:不重寫,無意義】 3. 父類引用指向子類對象【格式體現】 多態的體現 格式 父類類型 變數名 = new ...
同一行為,通過不同的事物,可以體現出來的不同的形態。多態描述的就是這樣的狀態。
定義:是指同一行為,具有多個不同表現形式。
多態的前提
1. 繼承或者實現【二選一】
2. 方法的重寫【意義體現:不重寫,無意義】
3. 父類引用指向子類對象【格式體現】
多態的體現
格式
父類類型 變數名 = new 子類對象;
變數名.方法名();
Fu z = new Zi(); //父類引用子類對象
z.method(); //調用子類的方法
註:當使用多態方式調用方法時,首先檢查父類中是否有該方法,如果沒有,則編譯錯誤;如果有,執行的是子類重寫後方法
多態的好處
父類類型作為方法形式參數,傳遞子類對象給方法,進行方法的調用,更能體現出多態的擴展性與便利。
引用類型轉換
向上轉型
多態本身是子類類型向父類類型向上轉換的過程,這個過程是預設的。
弊端:
無法使用子類特有的成員變數和成員方法
父類類型 變數名 = new 子類類型();
如:Animal a = new Cat();
向下轉型:前提必須是多態
父類類型向子類類型向下轉換的過程,這個過程是強制的。
子類類型 變數名 = (子類類型) 父類變數名;
如:Cat c =(Cat) a;
為什麼要轉型
調用子類特有的方法,必須做向下轉型。
轉型異常
把貓類對象強轉成狗類對象就會出現:ClassCastException
避免出現類型轉換異常,在轉換前進行判斷
變數名 instanceof 數據類型
如果變數屬於該數據類型,返回true。
如果變數不屬於該數據類型,返回false。
小結
成員變數,靜態方法看左邊;非靜態方法:編譯看左邊,運行看右邊。
當父類變數引用子類對象時,在這個引用變數指向的對象中,他的成員變數和靜態方法與父類是一致的;他的非靜態方法,在編譯時是與父類一致的,運行時卻與子類一致(發生了重寫)。