public abstract class Animal {public abstract void eat();
}
public class Cat extends Animal{@Overridepublic void eat(){System.out.println("貓吃魚");}
}
public class demo01main {public static void main(String[] args) {//對象的向上轉型:就是父類引用指向子類對象Animal animal=new Cat();animal.eat();}
}
向上轉型一定是安全的,沒有問題的,正確的,但是也有一個弊端。對象一旦向上轉型為父類,那么就無法調用子類原本特有的內容
解決方案:用對象的向下轉型(還原)
注意事項:
(ClassCastException)
Animal animal=new Cat();//本來是貓,向上轉型成為動物
Cat cat=(Cat) animal;//本類是貓,已經被當做動物了,還原回來成為本來的貓
public abstract class Animal {public abstract void eat();
}
public class Cat extends Animal{@Overridepublic void eat(){System.out.println("貓吃魚");}public void catchMouse(){System.out.println("貓抓老鼠");}
}
public class Dog extends Animal{@Overridepublic void eat(){System.out.println("狗吃骨頭");}public void watchHouse(){System.out.println("狗看家");}
}
public class demo01main {public static void main(String[] args) {//對象的向上轉型:就是父類引用指向子類對象Animal animal=new Cat();animal.eat();Cat cat=(Cat)animal;cat.catchMouse();//下面是錯誤的向下轉型//本來是new的時候是一只貓 現在非要當做狗//錯誤寫法 編譯不會報錯,但是運行會出現異常//java.lang.ClassCastException,類轉換異常Dog dog=(Dog) animal;}
}
如何才能知道一個父類引用的對象,本來是什么子類?
instanceof
類名稱boolean
值結果,也就是判斷前面的對象能不能當做后面的實例public class DemoInstanceof {public static void main(String[] args) {Animal animal=new Dog();animal.eat();//如果希望調用子類特有方法 需要向下轉型//判斷一下父類引用animal本來是不是Dogif(animal instanceof Dog){Dog dog=(Dog) animal;dog.watchHouse();}//判斷一下animal 本類是不是Catif(animal instanceof Cat){Cat cat=(Cat) animal;cat.catchMouse();}giveMeAPet(new Dog());}public static void giveMeAPet(Animal animal){if(animal instanceof Dog){Dog dog=(Dog) animal;dog.watchHouse();}//判斷一下animal 本類是不是Catif(animal instanceof Cat){Cat cat=(Cat) animal;cat.catchMouse();}}
}
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态