This question already has answers here:
Execution of Java static blocks in subclasses

(2个答案)


2年前关闭。




当我使用y(Checks.y是子类)调用静态变量Checks时,不会执行静态块,并且y的值不会更新。
class Par {
    static int y = 4;
}

class Checks extends Par {
    static {
        y = 5;
    }
}

public class Check {
    public static void main(String args[]) {
        System.out.println(Checks.y); // here printing 4
    }
}

由于静态在所有子类之间共享,因此应该更新该值。

其背后的原因可能是什么?

最佳答案

y类未声明字段Checks

读取静态字段不会触发所引用类(Checks)的初始化,除非该类是声明该字段的类(请参见下面的JLS引用)。在此示例中,即使通过y访问Checks,也只会触发Par的初始化,因为Par是声明y的类。

换句话说,类Checks在某种意义上是在运行时不使用的。

这也许说明了为什么通过子类访问static成员是错误的,这会引起编译时警告。

the specification中有一个简单的解释:



最后一条注释说明了为什么未初始化您的子类。

08-28 18:15