有一个内部类的类。我希望输出为6 9
但突然它给了我0 9
。我想知道为什么我会得到如此意想不到的结果?
似乎在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);
}
}
答案 0 :(得分:2)
在调用docker inspect --format '{{.State.Pid}}' container_id
之后进行类字段分配。这就是你得到0的原因
在作业super()
之前,调用super(f1)
发生。 protected int f1 = 3;
(基本类型)的默认值为int
。
如您所知,函数0
在initialize()
中被覆盖,而B
是执行它的地方。
编辑:至于评论中的讨论,我从 Effective Java 2nd Edition,第17项:设计和继承文档中找到了一些不错的参考,或者禁止它:
为了允许继承,类必须遵守一些限制。构造函数不得直接或间接调用可覆盖的方法。如果违反此规则,将导致程序失败。超类构造函数在子类构造函数之前运行,因此在子类构造函数运行之前将调用子类中的重写方法。如果重写方法依赖于子类构造函数执行的任何初始化,则该方法将不会按预期运行。