0

我试图了解黑白父子函数调用机制的关系,但没有得到这个

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();
    }
}

输出:
问候孩子,为什么?这里的情况如何?
问候孩子


输出(我期望)
问候父母(原因:因为该方法存在于父类中)
问候孩子

4

3 回答 3

3

继承规则:如果子类中存在覆盖方法,它将首先执行,永远!并且父母的方法将被忽略。

那么,这里发生了什么?

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

>>这将创建一个新班级的孩子

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

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

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

于 2013-05-12T02:34:21.127 回答
1

之所以看到Greeting Child输出是因为greeting()方法SuperContructor覆盖了类的greeting()方法Parent。当一个方法重写另一个方法时,它完全取代了 is。请查看以下解释覆盖与隐藏的帖子:覆盖与隐藏 Java - 混淆

于 2013-05-12T02:27:54.050 回答
1

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

于 2013-05-12T02:29:01.140 回答