Java - 扩展了超变量a为0的原因

and*_*.hu 8 java extend

请看这段代码:

class Sup {
    int a = 8;

    public void printA() {
        System.out.println(a);
    }

    Sup() {
        printA();
    }
}

public class Sub extends Sup {
    int a = 9;

    @Override
    public void printA() {
        System.out.println(a);
    }

    Sub() {
        printA();
    }

    public static void main(String[] args) {
        Sub sub = new Sub();
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:控制台打印: 0 9
我知道子类将首先调用超类constructor
但是,为什么0 9 不是8 9

Era*_*ran 14

Sup构造函数调用printA()它时,它执行printA类的方法Sub(它覆盖了同名类的方法Sup),所以它返回aclass 的变量的值Sub,这仍然是0,因为实例变量Sub尚未初始化(它们是仅在Sup构造函数完成后初始化).

  • 这也是为什么一些代码标准要求构造函数中调用的所有方法都是"final"或"private"的原因.防止覆盖导致这些情况. (2认同)