【发布时间】:2011-08-25 08:19:49
【问题描述】:
我有一个父类。
import java.util.HashMap;
import java.util.Map;
public class Parent {
Map<String,String> map = new HashMap<String, String>();
public void process(){
System.out.println("parent");
this.checkFunction();
}
protected void checkFunction(){
System.out.println("parentC");
System.out.println(map);
}
public void init(){
(map).put("parent","b");
}
}
现在,正如预期的那样,我有一个子类。
import java.util.HashMap;
import java.util.Map;
public class Child extends Parent {
Map<String,String> map = new HashMap<String, String>();
public void checkFunction(){
System.out.println(map);
System.out.println("ChildC");
}
public void process(){
super.process();
System.out.println("Child");
}
public void init(){
super.init();
(map).put("child","b");
}
}
为了测试我想要的,我有一个主类。
public class test {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Child a = new Child();
a.init();
a.process();
Parent p = a;
p.checkFunction();
}
}
当我调用 a.process() 时,我假设它应该调用 child.process(),然后调用 super.process()。到目前为止,一切都很好。在 Parent 的 process() 中,它应该调用 checkFunction()。
现在,根据我的理解,它应该调用 Parent 类的 checkFunction() 。为什么会调用 Child 的 checkFunction()?
我的输出是这样的
parent
{child=b}
ChildC
Child
{child=b}
ChildC
我希望是这样的
parent
parentC
{parent=b}
Child
{child=b}
ChildC
【问题讨论】:
-
调用
Child.checkFunction是正确的。这就是 Java 动态多态性的本质。checkFunction调用的目标对象是Child的一个实例,所以会执行它对checkFunction的实现。
标签: java oop inheritance polymorphism overriding