一、概述
多態是繼封裝、繼承之後,物件導向的第三大特性。
生活中,例如跑步的動作,小貓、小狗和大象,跑起來是不一樣的。再例如飛的動作,昆蟲、鳥類和飛機,飛起來也是不一樣的。可見,同一行為,透過不同的事物,可以體現出來的不同的形態。多態,描述的就是這樣的狀態。
多態:
是指相同行為,具有多個不同表現形式。
前提【重點】
1.繼承或實作【二選一】
2.方法的重寫【意義體現:不重寫寫,無意義】
3.父類別引用指向子類別物件【格式體現】
免費線上學習影片推薦:java影片
#二、多態的體現
多型體現的格式:
父类类型 变量名 = new 子类对象; 变量名.方法名();
父類別類型:指子類別物件繼承的父類別類型,或是實現的父接口類型。
程式碼如下:
Fu f = new Zi(); f.method();
當使用多態方式呼叫方法時,首先檢查父類別中是否有該方法,如果沒有,則編譯錯誤;如果有,執行的是子類別重寫後方法。
程式碼如下:
定義父類別:
#定義子類別:
定義測試類別:
三、多態的好處
實際開發的過程中,父類別作為方法形式參數,傳遞子類別物件給方法,進行方法的調用,更能體現出多態的擴展性與便利性。
程式碼如下:
定義父類別:
#定義子類別:
定義測試類別:
public class Test { public static void main(String[] args) { // 多态形式,创建对象 // Cat c = new Cat(); // Dog d = new Dog(); // 调用showCatEat showCatEat(c); // 调用showDogEat showDogEat(d); /* 以上两个方法, 均可以被showAnimalEat(Animal a)方法所替代而执行效果一致 */ showAnimalEat(c); showAnimalEat(d); } public static void showCatEat(Cat c) { c.eat(); } public static void showDogEat(Dog d) { d.eat(); } public static void showAnimalEat(Animal a) { a.eat(); } }
當eat方法執行時,多型規定執行的是子類別重寫的方法,那麼效果自然與showCatEat、showDogEat方法一致, 所以showAnimalEat完全可以取代以上兩方法。
不只是替代,在擴充性方面,無論之後再多的子類別出現,我們都不需要寫showXxxEat方法了,直接使用showAnimalEat都可以完成。
所以,多態的好處體現在可以讓程式編寫的更簡單,並且有良好的擴充。
四、引用型別轉換
多型態的轉型分為向轉型與向下轉型兩種:
#向上轉型
向轉型:多型態本身就是子類別類型向父類別類型向上轉換的過程,這個過程是預設的。
當父類別引用指向子類別物件時,便是向上轉型。
使用格式:
父类类型 变量名 = new 子类类型(); 如:Animal a = new Cat();
向下轉型
#父類別類型向子類別類型向下轉換的過程,這個過程是強制的。
一個已經向上轉型的子類對象,將父類引用轉為子類引用,可以使用強制型別轉換的格式,便是向下轉型。
使用格式:
子类类型 变量名 = (子类类型) 父类变量名; 如 :Cat c =(Cat) a;
轉型演示,程式碼如下:
定義類別:
定義測試類別:
轉型的異常
转型的过程中,一不小心就会遇到这样的问题,请看如下代码:
这段代码可以通过编译,但是运行时,却报出了ClassCastException,类型转换异常!这是因为,明明创建了Cat类型对象,运行时,当然不能转换成Dog对象的。这两个类型并没有任何继承关系,不符合类型转换的定义。
为了避免ClassCastException的发生,Java提供了 关键字,给引用变量做类型的校验。
格式如下:
变量名 instanceof 数据类型 如果变量属于该数据类型,返回true。 如果变量不属于该数据类型,返回false。
所以,转换前,我们最好先做一个判断,代码如下:
想学习更多相关教程请访问:java入门学习
以上是java物件導向-多態的詳細介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!