父类强制转换为子类,子类为何编译通过,运行失败?
代码如下:
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




