一種事物有多種狀態(tài)稱為多態(tài)
多態(tài)分為運行時多態(tài)和編譯時多態(tài)
下面來介紹幾種體現(xiàn)多態(tài)的例子
1.向上轉(zhuǎn)型和重載體現(xiàn)了編譯時多態(tài)
2.向下轉(zhuǎn)型和重寫體現(xiàn)了運行時多態(tài)
下面重點介紹一下向上轉(zhuǎn)型和向下轉(zhuǎn)型
向上轉(zhuǎn)型
向上轉(zhuǎn)型指父類引用指向子類對象檐什,所以向上轉(zhuǎn)型必須發(fā)生在繼承關(guān)系中
例如i:父類是一個抽象的動物類替劈,而貓類繼承了動物類那么聲明一個父類的引用變量指向子類的對象卿嘲,這種被稱為向上轉(zhuǎn)型,轉(zhuǎn)型之后父類引用只能引用自己的變量和方法,但如果子類重寫了父類中同名方法那么父類調(diào)用此方法時是調(diào)用的子類重寫之后的方法
Animal animal = new Cat();
animal.eat();//調(diào)用的為子類中重寫父類的方法
animal.sleep();
向下轉(zhuǎn)型(強制的)
因為父 類引用不能調(diào)用子類特有的屬性和方法所以需要將父類引用變量給子類
注意:被強制轉(zhuǎn)換的父類引用一開始就是指向子類對象的而不是指向父類創(chuàng)建的對象,所以向下轉(zhuǎn)型的條件為先向上轉(zhuǎn)型再向下轉(zhuǎn)型
Father father = new Son();
Son son = (Son) father; //這種方式是正確的
Father father = new Father();//一開始就是父類引用變量指向了父類的對象
Son son = (Son) father; //這種方式是錯誤的
那么向下轉(zhuǎn)型時怎么判斷要轉(zhuǎn)型的對象是不是由你想轉(zhuǎn)成的對象類型呢,這就用到了一個判斷語句
對象 instance of 類名 返回值為boolean類型
package com.qf.demo5;
import com.qf.demo4.Animal;
public class Test {
public static void main(String[] args) {
Fathor fathor = new Son();// 自動的向上轉(zhuǎn)型
fathor.beijingOpera();
// 父親的名字 不能直接調(diào)用兒子特有的方法
//fathor.song();
// 向下轉(zhuǎn)型 因為 父類名字不能調(diào)用子類特有的方法
Son son = (Son) fathor;// 向下轉(zhuǎn)型
son.song();
Fathor fathor2 = new SecondSon();
fathor2.beijingOpera();
//fathor2.dance();
// 向下轉(zhuǎn)型
SecondSon secondSon = (SecondSon) fathor2;
secondSon.dance();
SecondSon secondSon2 = new SecondSon();
show(secondSon2);//調(diào)用show()方法
Son son2 = new Son();
show(son2);
}
public static void show(Fathor fathor){// SecondSon
fathor.beijingOpera();
// ClassCastExecption 類型轉(zhuǎn)換異常
// 通常發(fā)生在 向下轉(zhuǎn)型時 ,轉(zhuǎn)成的類 并不是對象的真正的實體的類型
// 左邊的對象 是否是有哦 右邊的類 創(chuàng)建出來的
if(fathor instanceof Son){ //調(diào)用該判斷函數(shù)
Son son = (Son) fathor;
son.song();
}else
if(fathor instanceof SecondSon){
SecondSon secondSon = (SecondSon) fathor;
secondSon.dance();
}
}
}
下面再看一個例子
package com.qf.demo12;
public class Test1 {
public static void main(String[] args) {
Object o1 = new Object();
System.out.println(o1 instanceof Object);
System.out.println(o1 instanceof String);
String o2 = new String();
System.out.println(o2 instanceof Object);
System.out.println(o2 instanceof String);
Object o3 = new String();
System.out.println(o3 instanceof Object);
System.out.println(o3 instanceof String);
o2 = (String)o1;//向下轉(zhuǎn)型的前提是o1是子類所創(chuàng)但是此o1是父類引用指向的就是父類對象
o2 = (String)o3;//此處是向下轉(zhuǎn)型,正確
o2 = (String)o1;//此處錯誤在強轉(zhuǎn)o1(o1是父類所創(chuàng)),不在于前面是誰接收
o3 = o1; //此處正確磺平,父類引用指向父類對象
}
}