代码:
public class Solution {
public static void main(String[] args) {
new B(6);
}
public static class A {
private int f1 = 7;
public A(int f1) {
this.f1 = f1;
initialize();
}
protected void initialize() {
System.out.println(f1);
}
}
public static class B extends A {
protected int f1 = 3;
public B(int f1) {
super(f1);
this.f1 += f1;
initialize();
}
protected void initialize() {
System.out.println(f1);
}
}
}
打印的结果是0 9
,我不是很理解,调试之后发现父类A的构造函数在调用initialize()
方法时调用的是子类B中的同名方法,且输出结果为0,表示f1
没有被初始化,这是为什么?
构造方法是 最高层向下执行 子类调用-父类-调用-父类的父类
至于那个初始化方法 new的实例是谁 当然调用谁的方法
子类没有该方法 才会去找父类的呀 而这里子类B有初始化 方法
你可以尝试把f1设置成静态 再测试 结果又是什么呢
然后你就可以去学类加载机制了
你再看这个例子 new的实例是B的 你转型成A不还是调用B的toString嘛
dug了一下,你自己打个断点也看看,你看执行到A这里的时候是这样
子类重写方法了,父类调用了子类的方法。f1还没初始化所以输出的是0。跟静态绑定和动态绑定有点关系,感兴趣可以去看下。
看看这个或许能解开你的疑惑。
https://blog.csdn.net/qq_44823756/article/details/120536063