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引用{{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
?
答案 0 :(得分:1)
现在,我在ParentClass和ChildClass类中都有一个名为parentClassMethod的方法(重写)。
不,不。您在parentClassMethod
中有一个名为ParentClass
的方法,在ParentClassMethod
中有一个名为ChildClass
的方法。由于所有Java标识符都区分大小写,因此两者之间没有关联。 ParentClassMethod
不会覆盖parentClassMethod
的{{1}}。
如果(i)工作正常,为什么不(ii)或(iii)?
在(ii)和(iii)中,您试图将ParentClass
的实例强制转换为ParentClass
的实例。这是不允许的,因为ChildClass
不是ChildClass
,只有ParentClass
是Object
。
在(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区分大小写,并且您的方法名称不匹配。