
口訣:
UpCasting - 如果你的本質是「子型別」,但把你視為「父型別」來看。討論在 Java 中的 UpCasting 與 DownCasting 問題
DownCasting - 如果本質是「父型別」,但把你視為「子型別」來看。
public class Animal
{
public void run() {}
public void eat() {}
}
public class Fish extends Animal
{
public void swim() {}
}
1. UpCasting 父類別的參考指向子類別物件
Animal ref = new Fish()
記法:
UpCasting 就是把「子類別物件」交由「父類別參考」指著 (由下往上提了)
這就是常用的「多型」概念。為何可以這樣做?因為「父類別」能存取的變數、呼叫的函式,在子類別中都有(兒子比老爸強),所以不會出錯
例如:
ref.run() 與 ref.eat() 這兩個動作在 Fish 物件中,都是可以辦到的。2. DownCasting 子類別的參考指向父類別物件,需要強制轉型
Fish ref = (Fish)new Animal() /* 強制轉型做 DownCasting */
記法:
DownCasting 就是把「父類別物件」交由「子類別參考」指著(由上往下降了)經由強制轉型,可以順利編譯完成,但是將來會有機會發生 runtime error
因為:
照理來說 ref 為 Fish 型態,所以支援 ref.swim() 是天經地義。但 ref 骨子裡是 Animal 跟本就沒辦法做到 swim() 這個功能,結果就是 runtime error
那請問有方法可以避免向下轉型所發生的ruuntime error嗎?謝謝
回覆刪除