Java:转换ParentClass和ChildClass(Downcast运行时错误)

时间:2013-01-19 07:20:13

标签: java casting type-conversion downcast

public class InheritanceDemo {

    public static void main(String[] args) {

        ParentClass p = new ParentClass();
        ChildClass c = new ChildClass();

        //Casting ChildClass to ParentClass
        ParentClass pc = new ChildClass();
        pc.parentClassMethod(); //Output: Parent Class Method (as expected)

        //Again Casting Parent Class to ChildClass explictly
        //Question 1 for this code
        ChildClass cp = (ChildClass) pc;
        cp.parentClassMethod(); //Output: Parent Class Method (unexpected)

        ChildClass cc1 = (ChildClass) new ParentClass();
        cc1.parentClassMethod(); //Compiles, but Run Time Error

        ChildClass cc2 = (ChildClass) p;
        cc2.parentClassMethod(); //Compiles, but Run Time Error

    }
}

class ParentClass {

    public void parentClassMethod(){
        System.out.println("Parent Class Method");
    }

}

class ChildClass extends ParentClass {

    public void ParentClassMethod(){
        System.out.println("Parent Class Method From Child Class");
    }

    public void ChildClassMethod(){
        System.out.println("Child Class Method");
    }

}

问题1:

现在,我在parentClassMethodParentClass类中都有一个名为ChildClass的方法(重写)。当我将ParentClass转换为ChildClass然后调用parentClassMethod时,如果cp引用{{1},为什么它会执行ParentClass方法而不是ChildClass中的方法}}?

问题2:

(i)ChildClass

(ii)ChildClass cp = (ChildClass) pc; (iii)ChildClass cc1 = (ChildClass) new ParentClass();

如果(i)工作正常,为什么不(ii)或(iii)?

因为我在两种情况下从ChildClass cc2 = (ChildClass) p;投射到ParentClass

2 个答案:

答案 0 :(得分:1)

  

现在,我在ParentClass和ChildClass类中都有一个名为parentClassMethod的方法(重写)。

不,不。您在parentClassMethod中有一个名为ParentClass的方法,在ParentClassMethod中有一个名为ChildClass的方法。由于所有Java标识符都区分大小写,因此两者之间没有关联。 ParentClassMethod不会覆盖parentClassMethod的{​​{1}}。

  

如果(i)工作正常,为什么不(ii)或(iii)?

在(ii)和(iii)中,您试图将ParentClass的实例强制转换为ParentClass的实例。这是不允许的,因为ChildClass不是ChildClass,只有ParentClassObject

在(i)中,您试图将String的实例(存储在声明为ChildClass的引用中)转换为ParentClass,这是允许的。

在投射时,它是重要的运行时类型(换句话说,ChildClass中使用了T)。

答案 1 :(得分:0)

让我们回到jdk 1.4,当仿制药不存在时。

  Vector test = new Vector();
   test.add("java");

现在在检索你做的事情时:

String str = (String) test.get(0);

所以字符串最初是作为一个对象存储在向量中,然后你将它下载到String并且它很好。

但是,如果你尝试跟随它,它将不起作用:

String str = (Object) new Object();

所以你可以看到,在第一种情况下它是String,但是引用是Object [在向量内部],在这种情况下你可以向下转换它可以工作。

要回答您的第一个问题,java区分大小写,并且您的方法名称不匹配。