java父类和子类的构造方法中有同名函数调用哪个?

代码:

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设置成静态 再测试 结果又是什么呢

然后你就可以去学类加载机制了

img

你再看这个例子 new的实例是B的 你转型成A不还是调用B的toString嘛

img

dug了一下,你自己打个断点也看看,你看执行到A这里的时候是这样

img


执行下一个,关键来了啊,它执行的是B的这个方法,这时候B的f1还没有赋值上值,所以是0了

img

img

子类重写方法了,父类调用了子类的方法。f1还没初始化所以输出的是0。跟静态绑定和动态绑定有点关系,感兴趣可以去看下。

看看这个或许能解开你的疑惑。
https://blog.csdn.net/qq_44823756/article/details/120536063