作者TonyQ (沉默是金。)
看板java
标题Re: [问题] 有关object casting的问题
时间Mon Mar 22 00:47:53 2010
※ 引述《paulcaptain (我不会写程式)》之铭言:
: 标题: [问题] 有关object casting的问题
: 时间: Mon Mar 22 00:07:53 2010
:
: 参考了http://programming.im.ncnu.edu.tw/J_Chapter6.htm
: 我知道upcasting和downcasting的差异
:
: 但是我有一个问题,
: 当我於主程式之内new一个B类别名为b, 且有一个副程式名为show(Object obj)比如
:
: 然後在主程式呼叫此副程式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类别呢?
:
你的问题有点复杂而且问的蛮混乱的,
一个一个从头讲起。
首先先从继承树开始
Object <- Animal <- Bird 这个认知要有
再来为什麽 show(Object obj) 可以吃 B 的instance 当parameter ,
是因为在这里 B 向上转型为 Object (请见上面继承树)。
再来有关这段code
public static void show(Object obj)
{
if( obj instanceof A )//假设有继承关系为真
{
B newobj= (B)obj;
newobj.show();//假设B类别有show()此方法
}
}
instnaceof 是个运算元,在左方的instance是右方的类别(或子类)时为真。
而当 obj 是 B 类的 instance 时,根据继承树我们可以知道他也是
Object、Animal的 instance ,所以此时条件式为真。
至於 B newobj =(B) obj ,是对 obj 作向下转型,
如果 obj 型态不能被转为 B 在runtime 会叫Exception,如果OK就没问题。
在这个case里本来 obj 就是 B 的子类,没问题。
题外话,所以在这个 case 里 ,
show 并不保证一定会吃到不会出Exception的parameter,
假设今天跑 show(new Dog()); ,
虽然 dog 是 Animal 但却不能转型成 B ,就会丢 Exception。
--
What do you want to have ? / What do you have?
从书本中,你可以发现我的各种兴趣。
从CD中,你可以了解我所喜欢的偶像明星。
或许从文字你很难以了解一个人,但从物品可以。
My PPolis , My past. http://ppolis.tw/user/Tony
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.218.161
※ 编辑: TonyQ 来自: 220.133.218.161 (03/22 00:49)
1F:→ paulcaptain:谢谢TonyQ, 您解释得很清楚, 我现在也知道为何如此了! 03/22 01:00