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

沒有留言:

張貼留言