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:
现在,我在
parentClassMethod
和ParentClass
类中都有一个名为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
不是-ParentClass
,Object
就是String
。
在(i)中,您尝试将ChildClass
的实例(存储在声明为ParentClass
的引用中)强制转换为ChildClass
,这是允许的。
进行转换时,最重要的是运行时类型(换句话说,T
中使用的new T()
)。
关于java - Java:强制转换ParentClass和ChildClass(下行运行时错误),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14412093/