口訣:
- UpCasting - 如果你的本質是「子型別」,但把你視為「父型別」來看。
- 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嗎?謝謝
回覆刪除回答樓上問題
回覆刪除使用instance of 確認後再強制轉型,就不會發生runtime的問題
更正是 instanceof 這個關鍵字去檢查
回覆刪除