1.概念:父類的引用可以指向不同子類對象,從而導致父類引用的多種形態。
2.語法:父類類名 引用名=new 子類類名(構造參數);
父類類型 子類類型
父類引用 子類對象
主觀認為類型 客觀實際類型
3.特點:
① 子類對象類型,始終不變;
② 編譯時,使用父類引用只能調用父類中聲明的方法或屬性,不可以調用子類獨有
的屬性和方法;
③ 運行時,如果子類覆蓋了父類中的方法,則執行子類中覆蓋的方法,否則執行從
父類繼承到的方法。
4.對象類型 的 類型轉換
① 子類對象 賦值給 父類引用
Animal a=new Dog();
結論:多態(父類引用 指向 子類對象)
② 父類引用 賦值給 子類引用(小類型= 大類型)
Animal a=new Dog();
Dog
d=(Dog)a;
結論:父類引用賦值給子類引用,必須進行強制類型轉換(只保證編譯OK);
運行時,可能會出現java.lang.ClassCastException類型轉換異常。
③ 不存在繼承關系的對象 相互賦值
Dog d=new Dog();
Person p=(Person)d; //Error,沒有關系
結論:不存在繼承關系的對象,不允許相互轉換。
instanceof
① 語法: 引用名 instanceof 類名
判斷引用指向的對象和后面的類型,是否兼容:兼容-true;不兼容-false。
② 作用:先判斷真實類型,再進行向下轉型,可以避免轉換類型異常。
③ 例:
Animal a = new Dog();
a instanceof Dog //true
a instanceof Cat //false
a instanceof Animal //true
6.多態在開發中的應用
① 多態應用在方法的參數上
調用方法時,可以傳的實參類型包括 父類和其所有的子類對象。
② 多態應用在返回值上
調用方法后,可以得到的結果類型包括 父類和其所有的子類對象。
7.多態的好處
對使用者 屏蔽各子類間的不同差異,使得方法的調用更簡單、通用。