9月 25, 2010

Java 的 UpCasting 與 DownCasting



口訣:
  • UpCasting - 如果你的本質是「子型別」,但把你視為「父型別」來看。
  • DownCasting - 如果本質是「父型別」,但把你視為「子型別」來看。
討論在 Java 中的 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

3 則留言:

  1. 那請問有方法可以避免向下轉型所發生的ruuntime error嗎?謝謝

    回覆刪除
  2. 回答樓上問題

    使用instance of 確認後再強制轉型,就不會發生runtime的問題

    回覆刪除
  3. 更正是 instanceof 這個關鍵字去檢查

    回覆刪除