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

xinlnix 2006-03-17 12:28:03
代码如下:
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)

请问,这段代码是否有误,应该怎样做才能使子类正常工作?
...全文
765 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
B b=null;
if(a instanceof B) b=(B)a;
xinlnix 2006-03-17
  • 打赏
  • 举报
回复
//测试父类强制转换为子类

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(阿梁)
imA 2006-03-17
  • 打赏
  • 举报
回复
to xinlnix(心海灵灯) :
Java中有没有明确说我记不清了。但是你最笨的办法就是你写两个类A、B(里面什么都不用实现),B继承A,然后把A的一个实例转换成B的一个实例,你看看行不行,如果不行就不可以。
xinlnix 2006-03-17
  • 打赏
  • 举报
回复
to imA(阿梁):

我记得Delphi好象可以将父类转换给子类,Java手册中有明确地说明吗?
imA 2006-03-17
  • 打赏
  • 举报
回复
to 一楼:
你那样是没有用的,因为你的if语句块中的代码是没有被执行的。
imA 2006-03-17
  • 打赏
  • 举报
回复
不能这样转换,只能将子类型强制转换成父类型。

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

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧