作者paulcaptain (我不會寫程式)
看板java
標題[問題] 有關object casting的問題
時間Mon Mar 22 00:07:53 2010
參考了
http://programming.im.ncnu.edu.tw/J_Chapter6.htm
我知道upcasting和downcasting的差異
Animal a1, a2, a3, a4;
Bird b;
Dog d;
Fish f;
a2 = a1 = new Animal();
b = new Bird();
d = new Dog();
f = new Fish();
System.out.println(a1.moveMethod());
System.out.println(b.moveMethod());
System.out.println(d.moveMethod());
System.out.println(f.moveMethod());
a1 = b; // Correct, we call this upcasting
b = a1; // Compile Error, type not compatible
b = (Bird)a1; // downcasting, Compile Correct
a2 = b; // Correct,we call this upcasting
d = a2; // Compile Error, type not compatible
d = (Dog)a2; // Compile Correct, but runtime error
但是我有一個問題,
當我於主程式之內new一個B類別名為b, 且有一個副程式名為show(Object obj)比如
public static void show(Object obj)
{
if( obj instanceof A )//假設有繼承關係為真
{
B newobj= (B)obj;
newobj.show();//假設B類別有show()此方法
}
}
然後在主程式呼叫此副程式show(b), 卻不會有runtime error??
object不是根類別嗎? 為何根類別強制轉型為子類別時(B newobj= (B)obj;)
不會出現runtime error?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.37.76.163
→ rmbrick:所以他已經先問說是不是A了 03/22 00:10
→ paulcaptain:不好意思, 樓上我不知道你所指的意思是...... 03/22 00:17
→ TonyQ:你看到的那個部份就跟 b = (Bird)a1; 意思一樣啊 03/22 00:21
→ TonyQ:Object是所有類別的父類別,也就是Object是A的父類別 03/22 00:23
→ paulcaptain:obj instanceof A 不是應該是指obj繼承A嗎? 03/22 00:30
想再請教一下, 為何show(Object obj)可以使用Object接收B類別呢?
※ 編輯: paulcaptain 來自: 114.37.76.163 (03/22 00:34)
推 PsMonkey:你的文章當中根本沒有解釋 B 跟 A 的關係... 03/22 00:45
→ PsMonkey:B extend 或是 implement A 就沒問題啊 根本是算命文嘛 03/22 00:46
→ TonyQ:註解裡跟原文網址有提到啦...樓上別衝動XD 03/22 00:48
→ paulcaptain:謝謝TonyQ幫忙解釋...... 03/22 00:57
推 PsMonkey:==.=== 誰知道你的 B 是 bird,話不講清楚不要怪版規嚴格 03/22 01:36