Java关系b / w父子函数调用机制

时间:2013-05-12 02:22:58

标签: java polymorphism

我试图理解关系b / w父和子函数调用机制,但没有得到这个

class Parent {
    Parent() {
        greeting();//as we are not calling this on any object, by default it has Parent's greeting method
    }

    void greeting() {
        System.out.println("Greeting Parent");
    }
}

public class SuperConstructor extends Parent {
    public SuperConstructor() {
   //super(); //i know this
        greeting();
    }

    void greeting() {
        System.out.println("Greeting Child");
    }

    public static void main(String[] args) {
        new SuperConstructor();
    }
}

输出:
问候孩子,为什么?事情如何运作?
问候儿童


输出(我预计)
问候父母(原因:因为父类中有方法)
问候儿童

3 个答案:

答案 0 :(得分:3)

继承规则:如果子类中存在重写方法,它将始终首先执行!父母的方法将被忽略。

那么,这里会发生什么?

>> new SuperConstructor();将首先执行。

>> 这将创建一个新的孩子类

>> 永远记住,如果您的子构造函数没有调用 super 构造函数,那么 JVM 将隐式添加一个在子类构造函数中。这将是第一行执行。

>> 因此,您的子构造函数将调用Super()。并且您的父级consturctor将执行greeting();由于子类具有该方法覆盖,它将执行该方法而不是父级。为什么?因为那是我们的继承规则所以说。

>> 之后,子构造函数执行将正常进行。下一行是greeting();,这将再次执行Child的方法。为什么?因为我们的继承规则是这样说的。

答案 1 :(得分:1)

Greeting Child视为输出的原因是因为greeting()中的SuperContructor方法会覆盖greeting()类的Parent方法。当一个方法重写另一个方法时,它完全取代了。请查看以下帖子,其中解释了Overriding vs Hiding:Overriding vs Hiding Java - Confused

答案 2 :(得分:1)

这是因为Parent正在调用重写方法。将其设为私有,您将得到您所期望的,私有方法不会被覆盖。