为什么静态初始化程序块在这种简单的情况下不运行?

use*_*872 6 java static load initialization

 class Z
{
    static final int x=10;
    static
    {
        System.out.println("SIB");
    }

}
public class Y
{
    public static void main(String[] args)
    {
        System.out.println(Z.x);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:10为什么静态初始化块在这种情况下不加载?当静态x调用时,所有类z的静态成员必须至少加载一次但静态初始化块不加载.

Par*_*rth 1

声明中带有 static 修饰符的字段称为 静态字段类变量它们与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类实例的情况下操作类变量

因此,当您Z.x如下调用时:

System.out.println(Z.x);
Run Code Online (Sandbox Code Playgroud)

它不会初始化该类,除非您调用它时它会从固定的内存位置Z.x获取该类。x

静态块在 JVM 加载时运行class Z。它永远不会在这里加载,因为它可以x直接访问它而无需加载类。