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引用的是ParentClass,为什么为什么要执行ChildClass方法而不是ChildClass方法呢?

问题2:

(i)ChildClass cp = (ChildClass) pc;

(ii)ChildClass cc1 = (ChildClass) new ParentClass();
(iii)ChildClass cc2 = (ChildClass) p;

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

因为我在两种情况下都从ParentClass投射到ChildClass

最佳答案

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


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


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


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

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

进行转换时,最重要的是运行时类型(换句话说,T中使用的new T())。

关于java - Java:强制转换ParentClass和ChildClass(下行运行时错误),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14412093/

10-10 02:34