gpt4 book ai didi

java - 为什么对父类构造函数的调用不调用在子类中重写的父方法?

转载 作者:行者123 更新时间:2023-12-01 22:54:54 25 4
gpt4 key购买 nike

如下面的代码所示,给定一个父类(super class) Parent,其方法 calculate()Parent 的构造函数中调用,但在 Child 类中也被覆盖,为什么在 Child 的构造函数中隐式调用 Parent 的构造函数不调用 Parent calculate() 而不是 Childcalculate()

class Parent {
Parent() {
calculate();
System.out.println("Empty parent ctor.");
}
void calculate() {
System.out.println("Parent calculating...");
}
}

class Child extends Parent {
Child() {
System.out.println("Empty child ctor.");
}
@Override
void calculate() {
System.out.println("Child calculating...");
}
}

public class ParentConstructor {
public static void main(String [] args) {
Parent child = new Child();
}
}

输出:

Child calculating...
Empty parent ctor.
Empty child ctor.

我会认为要正确构造一个 Parent 对象,它的构造函数应该总是用它自己的方法定义来调用吗?

最佳答案

父类中的方法永远不会被覆盖该方法的子类或子类调用,除非您使用 super 语句显式调用它。这是因为在方法调用过程中,执行哪个方法(父类或子类)是由对象类型决定的。

在运行时解决对重写方法的调用的过程称为动态方法分派(dispatch)。

class Child extends Parent {
Child() {
System.out.println("Empty child ctor.");
}
@Override
void calculate() {
super.calculate(); // calling parent implementation
System.out.println("Child calculating...");
}
}

关于java - 为什么对父类构造函数的调用不调用在子类中重写的父方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73514859/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com