Java-为什么打印null?

Num*_*tor 5 java runtime

public class Base {
public Base() {
    x = 0;
    bar();
}

public Base(int x) {
    this.x = x;
    foo();
}

public void foo() {
    System.out.println("Base.foo : " + x);
}

private void bar() {
    System.out.println("Base.bar:" + x.toString());
}

protected Integer x;
}

    public class Derived extends Base {
       public Derived() {
       bar();
       }
       public Derived(int x, int y) {
         super(x);
         this.y = y;
       }
       public void foo() {
         System.out.println("Derived.foo : " + x + ", " + y);
       }
       public void bar() {
         System.out.println("Derived.bar:" + x.toString() + ", " + y.toString());
       }
       private Integer y;


       public static void main(String[] args) {
        Base b = new Derived(10, 20);
      }
}
Run Code Online (Sandbox Code Playgroud)

为什么打印"Derived.foo:" 10, nulll而不是20而不是null?y是Derived的私有变量,它用20初始化.它在其范围内..那么为什么它为null?

JB *_*zet 7

因为超级构造函数首先被调用(super(x)).这个超级构造函数调用方法foo.然后Derived构造函数将y初始化为20(this.y = y).因此,当调用foo时,y尚未初始化.

在构造函数中调用可覆盖的方法是一种不好的做法,因为正如您刚才注意到的,它可以在部分构造的对象上调用重写方法.

  • +1,特别是对于不良练习警告:_it可以在部分构造的对象上调用重写方法. (2认同)