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引号就足够了:)