標籤:java 多態 向上轉型 向下轉型
好啦,這裡緊接著上次沒說的向下轉型,請讀者結合上次討論的向上轉型的例子一起探討(其實本次代碼也有加上,放心)。
我們這裡希望從向下轉型會出現的兩種基本情況進行探討
package downcasting;//動物類Animal父類class Animal{ String name; int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //動物會叫 public void cry(){ System.out.println("不知道怎麼叫"); } //動物吃東西 public void eat(){ System.out.println("不知道吃什麼"); }}//建立Dog子類並extends繼承Animal父類及覆蓋cry方法class Dog extends Animal{ //狗叫 public void cry(){ //覆蓋父類方法 System.out.println("汪汪叫"); } //狗吃東西 public void eat(){ //覆蓋父類方法 System.out.println("狗愛吃骨頭"); } public void bite(){ System.out.println("狗會咬人..."); }}public class Downcasting { public static void main(String[] args) { // TODO 自動產生的方法存根 Animal g1=new Dog(); //向上轉型 g1.cry(); g1.eat(); /* * 情況一:如果父類引用的對象如果引用的是指向的子類對象, * 那麼在向下轉型的過程中是安全的。也就是編譯運行是不會出錯誤的 */ Dog dog=(Dog)g1; //向下轉型,編譯和運行皆不會出錯 dog.cry(); dog.eat(); Animal g2=new Animal(); /* *情況二:如果父類引用的對象是父類本身,那麼在向下轉型的過程中是不安全的, *編譯不會出錯,但是運行時會出現java.lang.ClassCastException錯誤。 *它可以使用instanceof來避免出錯此類錯誤。 * */ /* *錯誤如下: Exception in thread "main" java.lang.ClassCastException: * downchange.Animal cannot be cast to downchange.Dog at downchange.Downchange.main(Downchange.java:62) Dog dog1=(Dog)g2; dog1.cry(); dog1.eat(); */ if(g2 instanceof Dog){ Dog dog1=(Dog)g2; dog1.cry(); dog1.eat(); } else if(g2 instanceof Animal){ System.out.println("g2是Animal的執行個體");} //Dog g3=new Animal(); //不存在從Animal轉換到Dog }}
ps:
instanceof:
1.用instanceof來測試它所指向的對象是否是某個類。
2.instanceof在物件類型的強制轉換,先判斷是否是某種類型,是的話再強制轉換成改類型。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
JAVA多態學習2