读Thinking in Java中关于向下转型和强制类型转换的问题

0 views
Skip to first unread message

sowill

unread,
Nov 4, 2005, 11:41:03 PM11/4/05
to Hack Soul
原书的例子我做了一些修改(见P244页):

import java.util.*;

class Useful{
public void f(){System.out.println("Useful.f()");}
public void g(){System.out.println("Useful.g()");}
}

class MoreUseful extends Useful{
public void f(){System.out.println("MoreUseful.f()");}
public void g(){System.out.println("MoreUseful.g()");}
public void u(){System.out.println("MoreUseful.u()");}
public void v(){System.out.println("MoreUseful.v()");}
public void w(){System.out.println("MoreUseful.w()");}
}

public class Rtti{
public static void main(String [] args){
Useful[] s={
new Useful(),
new MoreUseful()
};
s[0].f();
s[1].g();
// s[1].u();

((MoreUseful)s[1]).u();
//s[1]可被向下转型为MoreUseful
((MoreUseful)s[0]).u();
//s[0]不能被向下转型为MoreUseful,这里报错
MoreUseful a=(MoreUseful)s[0];
//不能进行强制类型转换,为什么?
a.u();
}
}


s[1]可被向下转型为MoreUseful,因为s[1]是从MoreUseful类型转上去的

所以现在还可以下来
s[0]不能被向下转型为MoreUseful,是因为s[0]本来是Useful类型

是MoreUseful的父类
也就是说向下转型只发生在子类转型到父类后又想做回到自己的时候
,不知道我
这样理解对不对,另外在什么情况下可以强制类型转换,是在任意类之间吗?如果是这样

为什么上面不行?

---------------------------------------------------------------

基本类型的强制转换就不说了。
引用类型的强制转换有一些先决条件:

首先分清对象和引用。对象在存在于内在中的一个实体,而引用是是告诉程序可以在哪里找到这个实体。由于
Java
不允许直接操作内存,所以我们对实体没有直观的印象。


然后,搞明白,强制转换是发生在引用上的,不是发生在实体上的。


从子类引用转换到父类引用,是不需要强制转换的。比如,你可以说女人是人,但你不能说人是女人,就是这个道理。


强制转换发生在父类引用到子类引用的情况下,但先决条件是实体的实际类型,必须是强制转换后的类型的子类型。


比如,一个女人,有这么一个实体,我用“人”来表示他。但进厕所的时候,要分男女,所以我说这个人是女人,可以进女厕所。但如果我说他是男人(比如打扮为男人),可她实际是女人,那么我说他是男人这就是错的,在
Java 里叫 ClassCaseException (好像是这个)

Reply all
Reply to author
Forward
0 new messages