class A
{
public void test()
{
System.out.println("A:Hello");
}
public void test2()
{
System.out.println("A:World");
}
}class B extends A
{
public void test()
{
System.out.println("B:Hello");
}
public void test3()
{
System.out.println("B:Hello,World!");
}
}class C
{
public static void main(String[] args)
{
A a=new A();
call(a);
}
public static void call(A a)
{
B b=(B)a;
b.test();
b.test2();
b.test3();
}}以上的代码,在编译时没错,在运行时出了错,不知道错在哪?父类转换成子类,B b=(B)a这一句有错吗?

解决方案 »

  1.   

    B b=(B)a;-----非安全的向下转型,如果要使转型成功必须将mian方法里的
    A a=new A();改成A a=new B();使A指向的实质是B的存储空间
    ps:向上转型的时候会遗失掉除子类与父类共有的其它方法!
      

  2.   

    是的你那句有错!!A a = new A();//现在引用a是指向父类实例的。(因为你是B集成A嘛)。B b = (B)a;//你把a强制转换成子类B类型怎么行呢?打个比方:定义父类class Car  然后呢你又定义class BMW extends Car
    现在如果你这样:Car car = new Car(); //car是指向Car类型的。
                    BMW bmw = (BMW)car;//这句就是错误的。我们可以说宝马是车,但你能说车是宝马吗?那奔驰,奥迪是什么?对不对?这是一个道理。
    如果代码是这样的就对了。A a = new B();
                            B b = (B)a;