【发布时间】:2021-09-21 19:24:49
【问题描述】:
我想了解为什么会出现以下代码的结果:
public class Base {
private int member1 = 1;
private int member2 = 2;
public Base() {
System.out.println("base ctor");
print();
}
public void print() {
System.out.println(member1 + "" + member2);
}
}
class Derived extends Base {
private int member3 = 3;
private int member4 = 4;
public Derived() {
System.out.println("derived ctor");
print();
}
public void print() {
System.out.println(member3 + "" + member4);
}
}
class Test{
public static void main(String[] args) {
Derived d = new Derived();
}
}
是:
base ctor
00
derived ctor
34
-
派生类的构造函数隐式调用它的父类
-
构造函数。 super 的(基类)构造函数打印“base ctor”
super 的构造函数调用print() - 打印member 1 , member 2
我认为 member1 和 member2 已经初始化,因为我认为我知道,当我们创建一个对象时,事物的顺序是
静态字段和块先行(如果它是类的第一次加载)
然后实例事物(如字段和成员)按顺序排列,这意味着按代码顺序排列。
这里 - 字段在构造函数之前,这意味着它应该运行并且在它到达打印之前已经初始化了 member1 和 member2。
为什么打印0 0?
它甚至会打印到Base 还是打印到Derived?因为它是从Base 的构造函数中调用的,所以我不明白。
谢谢。
【问题讨论】:
标签: java inheritance constructor initialization overriding