站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题20分求解:这样强制类型转换怎么不行啊

20分求解:这样强制类型转换怎么不行啊

摘要: 20分求解:这样强制类型转换怎么不行啊


public class test{
public static void main(String [] args){
c1 _c1 = new c1();
c2 _c2 = (c2)_c1;
_c2.p1();
_c2.p2();
}
}
class c1{
public void p1(){System.out.println("haha");}
}
class c2 extends c1{
public void p2(){System.out.println("hehe");}
}

报Exception in thread "main" java.lang.ClassCastException: c1
at test.main(test.java:4)



c1 _c1 = new c1();
c2 _c2 = (c2)_c1;
_c2.p1();
_c2.p2();
你这个明显不对嘛,子类对象的引用可以向上转型为父类的引用;但是在父类引用向下转为子类引用的转型,必须满足引用指向的对象本身就是一个子类对象才行!
而在你这个程序中,对象本身是一个父类对象,所以向下转型会失败,因为它根本就不是一个子类c2的对象;更别说调用c2中的方法p2了


lz,如果父类对象引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制转换成子类对象的引用!
所以你的第三行应该改为:c1 _c1=new c2();
这样第四行才是正确的!
另外类对象不要写成_c1,_c2的形式!这样写不符合规范的!
我相信你应该满意了吧,满意的话就给分!


当应用程序代码尝试将某一对象[_c1]转换为某一子类[c2]时,如果该对象[_c1]并非该子类[c2]的实例,JVM 就会抛出 ClassCastException。

想知道更多? 请参看: http://blog.java-cn.com/user1/2028/archives/2005/12303.html


呵呵,来看看,


恩,我运行了,也出现类似的错误,估计应该是异常问题,但是,我也不太会,希望高手,指点一下!!!


刚才想到一个问题,自问自答了:

--------"在父类引用向下转为子类引用的转型,必须满足引用指向的对象本身就是一个子类对象才行!" 如果引用指向的对象已经是一个子类对象了,那还要转换干什么?

--------因为指向的对象并不一定被声明为他本来的类,比如在ArrayList里的元素. 比如一个类被转换成了父类,要再转回去


恩,success_dream(sharp engineer) 说的对1!!


c2 extends c1
c1 obj_c1=new c2();
c2 obj_c2=(c1)obj_c1;
这样就可以了。


↑返回目录
前一篇: 我的Serversocket为什么不能正常启动?
后一篇: 如何读取SQL SERVER里最新的5条数据