【问题标题】:OOPS concepts Call function of Parent class not ChildOOPS 概念调用父类而不是子类的函数
【发布时间】: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


【解决方案1】:

这是因为您在子类中覆盖了 checkFunction。因此,即使调用来自父类,子实例也会调用子 checkFunction。

如果你想从子类的实例调用父类的 checkfunction,你需要在子类中调用 super.checkFunction()。 super 关键字本质上是“向上移动”继承链。

super关键字的详细说明可以看here

【讨论】:

  • 谢谢@Ricick。我仍然不敢相信这是对的。这改变了我的一切。无论如何,我将如何从父母的班级调用父母的 checkFunction() 。通过覆盖,我知道我称孩子的函数不是父母的,但是当从父母进行调用时,父母对孩子的函数了解什么。欢迎评论!
  • 基本上你不能。如果要确保在子类中调用父方法,请不要覆盖它。通过覆盖,您明确表示“我不想使用父方法”。
  • 只是为了确认父函数中的数据访问将是仅父函数而不是子函数。 (就像上面的问题一样)
猜你喜欢
  • 2020-02-05
  • 2020-02-05
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
相关资源
最近更新 更多