物件的向上轉型和向下的轉型
阿新 • • 發佈:2022-05-23
1.物件的向上轉型,其實就是多型寫法:
格式:父類名稱 物件名=new 子類名稱();
Animal animal=new Cat(); //建立了一隻貓,當做動物看待,沒問題。
含義:右側建立一個子類物件,把它當做父類來看待使用。
注意事項:向上轉型一定是安全的。從小範圍轉向了大範圍,從小範圍的貓,向上轉型成為更大範圍的動物。
類似於:double num=100;//正確,int----->double,自動型別轉換。
2.物件的向下轉型,其實是一個【還原】的動作。
格式:子類名稱 物件名=(子類名稱)父類物件;
含義:將父類物件,【還原】成為本來的子類物件。
Animal animal=new Cat(); //本來是貓,向上轉型成為動物
Cat cat=(Cat) animal;//本來是貓,已經被當做動物了,還原回來成為本來的貓。
注意事項:
a.必須保證物件本來建立的時候,就是貓,才能向下轉型成為貓。
b.如果物件建立的時候本來不是貓,現在非要向下轉型成為貓,就會報錯。ClassCastException
類似於: int num=(int) 10.0;//可以 int num=(int) 10.0小;//不可以,精度損失
public abstract class Animal {
public abstract void eat();
}
==============================
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("貓吃魚");
}
//子類特有方法
public void CatchMouse(){
System.out.println("貓抓老鼠");
}
}
=================================
/*
向上轉型一定是安全的,沒有問題的,正確的。但是也有一個弊端:
物件一旦向上轉型為父類,那麼就無法呼叫子類原本特有的內容。
解決方案:用物件的向下轉型【還原】。
*/
public class Demo01Main {
public static void main(String[] args) {
//物件的向上轉型,就是:父類引用指向子類物件
Animal animal=new Cat();//本來建立的時候是一隻貓
animal.eat();//貓吃魚
// animal.CatchMouse();//錯誤寫法!
//向下轉型,進行“還原”動作
Cat cat=(Cat) animal;
cat.CatchMouse();//貓抓老鼠
//下面是錯誤的向下轉型
//本來new的時候是一隻貓,現在非要當做狗。
//錯誤寫法!編譯不會報錯,但是執行會出現異常:
//java.lang.ClassCastException,類轉換異常
Dog dog=(Dog) animal;
}
}
=============================================
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨頭");
}
public void watchHouse(){
System.out.println("狗看家");
}
}