對象具有多種形態(tài)
1、引用的多態(tài)
父類的引用可以指向本類的對象
父類的引用可以指向子類的對象
2、方法的多態(tài)
父類的引用可以指向本類的對象
Animal obj = new Animal();
父類的引用指向子類的對象
Animal obj1 = new dog();
注意: 不可以使用一個子類的引用指向父類的對象
注意:此時的obj1 只能調(diào)用dog類中繼承自Animal類中的方法,無法調(diào)用dog類中的非繼承方法。
方法的多態(tài)
同方法名 因參數(shù)不同可以指向不同的方法
void eat(){
System.out.print("狗狗愛吃骨頭");
}
void eat(int age){
System.out.print("狗狗年級大了就吃不動了");
}
如果調(diào)用eat方法 傳入int參數(shù) 就可以得到“狗狗年級大了就吃不動了”
多態(tài)中引用類型轉(zhuǎn)換
1、向上類型轉(zhuǎn)換(隱式/自動類型轉(zhuǎn)換,是小類型到大類型的轉(zhuǎn)換)(無風(fēng)險)
2、向下類型轉(zhuǎn)換(強制類型轉(zhuǎn)換,大類型到小類型)(有風(fēng)險)
3、instanceof運算符,來解決引用對象的類型,避免類型轉(zhuǎn)換的安全性問題
Dog dog = new dog();
Animal animal = dog;//向上類型轉(zhuǎn)換 無風(fēng)險
Dog dog2 = (Dog)animal; //向下(強制)類型轉(zhuǎn)換 有風(fēng)險
Cat cat = (Cat)animal;//eclipse無提示 但是編譯無法通過
問題是:
1、編譯時 cat類型
2、運行時 dog類型
instanceof 可以判斷
Dog dog = new dog();
Animal animal = dog;//向上類型轉(zhuǎn)換 無風(fēng)險
Dog dog2 = (Dog)animal; //向下(強制)類型轉(zhuǎn)換 有風(fēng)險
if(animal instanceof cat){
Cat cat = (Cat)animal;//eclipse無提示 但是編譯無法通過
}else{
System.out.print("無法進行類型轉(zhuǎn)換,轉(zhuǎn)換成cat類型");
}