我试图理解关系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();
}
}
输出:
问候孩子,为什么?事情如何运作?
问候儿童
输出(我预计)
问候父母(原因:因为父类中有方法)
问候儿童
答案 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正在调用重写方法。将其设为私有,您将得到您所期望的,私有方法不会被覆盖。