class Animal {}
class Dog extends Animal {
public void wangwang() { System.out.println("汪汪!"); }
}
Animal anAnimal = new Dog(); // 父類引用指向子類對象
// anAnimal.wangwang(); // 編譯錯誤:Animal 沒有 wangwang 方法
if (anAnimal instanceof Dog) {
Dog dog = (Dog) anAnimal; // 向下轉型
dog.wangwang(); // 正常調用
}
Animal anAnimal:編譯器只認得 Animal 類定義的方法(含繼承自 Object 的方法)。new Dog():運行時創建的是 Dog 實例,擁有 wangwang 方法,但編譯期通過 Animal 引用**看不見**。Dog dog = (Dog) anAnimal;
(目標類型) 引用變量。anAnimal 指向 Dog),否則拋 ClassCastException。if (anAnimal instanceof Dog) 先判斷類型,再轉型,避免異常。dog 變量類型為 Dog,編譯器允許調用 Dog 特有方法。棧:anAnimal (Animal 類型引用) ──────┐
▼
堆:Dog 對象 [ Animal 部分 | Dog 部分: wangwang() ]
▲
棧:dog (Dog 類型引用) ──────────────┘ (轉型後指向同一對象)
對象本身不變,只是**引用類型變了**,視野變大了。
makeSound()),子類重寫,避免轉型。anAnimal.makeSound(); // Dog 重寫後輸出「汪汪」ClassCastException。if (anAnimal instanceof Dog dog) { dog.wangwang(); } 一行完成判斷+轉型+賦值。Animal anAnimal = new Dog() 時,anAnimal 只能調用 Animal 定義的方法。(Dog) anAnimal 是**向下轉型**,將引用類型變更為 Dog,從而獲得調用子類特有方法(wangwang)的權限。前提是對象真的是 Dog,建議配合 instanceof 使用。良好設計應盡量通過多態避免轉型。