Java super()构造函数中的初始化问题

Java super()构造函数中的初始化问题,java,function,inheritance,constructor,super,Java,Function,Inheritance,Constructor,Super,有一个具有内部类的类。我希望输出是69 但突然它给了我09。我想知道为什么我会得到如此意想不到的结果? 似乎在A类中,f1变量以某种方式变为零。 为什么会发生这种情况 public static void main(String[] args) { new B(6); } public static class A { private int f1 = 7; public A(int f2) { this.f1 = f2; initi

有一个具有内部类的类。我希望输出是
69
但突然它给了我
09
。我想知道为什么我会得到如此意想不到的结果?
似乎在
A
类中,
f1
变量以某种方式变为零。
为什么会发生这种情况

 public static void main(String[] args) {
    new B(6);
}

public static class A {
    private int f1 = 7;

    public A(int f2) {
        this.f1 = f2;
        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);
    }
}

类字段赋值在调用
super()
之后。这就是您获得0的原因。
调用
super(f1)
发生在赋值
protectedintf1=3之前
int
(原语类型)的默认值是
0

正如您所知,函数
initialize()
在执行它的
B
中被重写

编辑:关于评论中的讨论,我从《有效Java第二版》第17项:继承的设计和文档中找到了一些很好的参考,或者禁止它:

类还必须遵守一些限制才能允许继承。构造函数不能直接或间接调用可重写的方法。如果违反此规则,将导致程序失败。超类构造函数在子类构造函数之前运行,因此子类中的重写方法将在子类构造函数运行之前调用。如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期的方式运行


super(f1)
调用不应该使用局部变量
f1
(其值为6),而不是
this.f1
?我在回答中没有提到这一点,因为我只关注OP想知道的
0
部分。但是对于你的问题,不,它使用从实例化传递来的6(这就是为什么我们在0之后打印9)。好的,但是你是说
A
的构造函数中的
initialize()
调用解析为
B.initialize()
,而不是
A.initialize()
?是的,如果我不清楚/误导的话,很抱歉。我的观点是,最终打印为
0
f1
位于
B
initialize()
中,它是
B
的本地代码。有效的Java引号就足够了:)