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

时间:2016-02-24 18:17:50

标签: java function inheritance constructor super

有一个内部类的类。我希望输出为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);
    }
}

1 个答案:

答案 0 :(得分:2)

在调用docker inspect --format '{{.State.Pid}}' container_id 之后进行类字段分配。这就是你得到0的原因 在作业super()之前,调用super(f1)发生protected int f1 = 3;(基本类型)的默认值为int

如您所知,函数0initialize()中被覆盖,而B是执行它的地方。

编辑:至于评论中的讨论,我从 Effective Java 2nd Edition,第17项:设计和继承文档中找到了一些不错的参考,或者禁止它

  

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