CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 扩展类

父类强制转换为子类,子类为何编译通过,运行失败?

楼主xinlnix(心海灵灯)2006-03-17 12:28:03 在 Java / J2SE / 扩展类 提问

代码如下:  
  lesson04b.java  
  class   A  
  {  
  public   void   func1()  
  {  
  System.out.println("A.func1");  
  }  
  public   void   func2()  
  {  
  System.out.println("A.func2");  
  func1();  
  }  
  }  
  class   B   extends   A  
  {  
  public   void   func1()  
  {  
  System.out.println("B.func1");  
  }  
  public   void   func3()  
  {  
  System.out.println("B.func3");  
  }  
  }  
  class   C  
  {  
  public   static   void   main(String[]   args)          
  {  
          System.out.println("强制类型转换A->B后的调用效果:");  
          A   a   =   new   A();  
          B   b   =   (B)a;  
          b.func1();  
  }  
  }  
  编译javac   lesson04b.java通过,  
  运行java   C时出错:  
   
  强制类型转换A->B后的调用效果:  
  Exception   in   thread   "main"   java.lang.ClassCastException:   A  
  at   C.main(test.java:31)  
   
  请问,这段代码是否有误,应该怎样做才能使子类正常工作?  
  问题点数:20、回复次数:6Top

1 楼zdsdiablo(十分钟年华老去)回复于 2006-03-17 12:54:57 得分 0

B   b=null;  
  if(a   instanceof   B)   b=(B)a;Top

2 楼imA(男的不会,会的不男)回复于 2006-03-17 13:01:19 得分 20

不能这样转换,只能将子类型强制转换成父类型。  
   
  因为继承的概念就是子孙类会越来越比祖先类详细,所以可以将子孙类强制转换成祖先类,因为祖先有的行为子孙类示例都有了(重新定义的或者是默认的);但是当将祖先类示例强制转换成子孙类示例的时候,一些子孙类有的行为祖先是没有的(即使的是默认的实现也没有)。所以你上面的转换是不可以的Top

3 楼imA(男的不会,会的不男)回复于 2006-03-17 13:05:03 得分 0

to   一楼:  
  你那样是没有用的,因为你的if语句块中的代码是没有被执行的。Top

4 楼xinlnix(心海灵灯)回复于 2006-03-17 13:55:48 得分 0

to   imA(阿梁):  
   
  我记得Delphi好象可以将父类转换给子类,Java手册中有明确地说明吗?Top

5 楼imA(男的不会,会的不男)回复于 2006-03-17 15:19:50 得分 0

to   xinlnix(心海灵灯)   :  
  Java中有没有明确说我记不清了。但是你最笨的办法就是你写两个类A、B(里面什么都不用实现),B继承A,然后把A的一个实例转换成B的一个实例,你看看行不行,如果不行就不可以。Top

6 楼xinlnix(心海灵灯)回复于 2006-03-17 19:01:33 得分 0

//测试父类强制转换为子类  
   
  class   A{}                         //父类  
  class   B   extends   A   {}   //子类  
  class   C  
  {  
                    //父类强制为子类,此处编译通过,但运行错误。  
                  public   static   void   main(String[]   args)  
                  {  
                                A   a   =   new   A();  
                                B   b   =   (B)a;    
                    }  
  }  
  错误仍是:  
  Exception   in   thread   "main"   java.lang.ClassCastException:   A  
  at   C.main(test.java:12)  
  道理明白了:在Java中根本不可能将父类强制转换为子类类型。谢谢imA(阿梁)    
  Top

相关问题

  • iewebcontrols编译安装失败
  • java的编译问题,父类更改,子类一定要重新编译吗?
  • 子类调用父类构造失败,为什么?
  • binutils-2.9-1 编译失败,请求帮助。
  • 编译JSP失败:illegal start of expression
  • 用函数编译通过,用属性表达式编译失败!
  • SetEnhMetaFileBits函数编译前成功,编译后的程序失败,原因?
  • SetEnhMetaFileBits函数编译前成功,编译后的程序失败,原因?
  • 如何将父类的类型,强制转换为子类的类型
  • 强制转换类型实现父类指针访问子类同名函数

关键词

  • 转换
  • 编译
  • 代码
  • 子类
  • 父类
  • 祖先
  • func
  • 示例
  • 通过
  • 子孙类

得分解答快速导航

  • 帖主:xinlnix
  • imA

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo