7
 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);
    }
}

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

4

6 回答 6

1

原因是jvm在加载一个类的时候,把这个类的所有常量成员都放到了常量区,当你需要它们的时候,直接用类名调用就行了,也就是说,它不需要实例化这个类Z. 所以不执行静态初始化块。

于 2013-03-26T09:56:30.980 回答
1

编译时 Zx 值变为 10,因为

static final int x=10; is constant

所以编译器在内联之后创建如下所示的代码

System.out.println(10); //which is not calling Z class at runtime
于 2013-03-26T09:42:36.483 回答
1

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

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

System.out.println(Z.x);

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

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

于 2013-03-26T09:52:20.307 回答
0

如果 X 不是最终的,那么在这种情况下,JVM 必须加载类“Z”,然后只会执行静态块。现在 JVM 不需要加载“Z”类,因此不会执行静态块。

于 2013-03-26T09:47:29.613 回答
0

它不会运行,因为该类从未加载。

public class Y
{
    public static void main(String[] args)
    {
        Z z new Z(); //will load class
        System.out.println(Z.x);
    }
}

由于x字段 onZ已被声明,static final它们是在固定的内存位置创建的。访问此字段不需要加载类。

于 2013-03-26T09:33:46.473 回答
0

如果一个常量被声明为 static final,则它被称为完美常量。当编译器编译 y 类时,在编译 sop(Zx) 时,它将 sop(Zx) 替换为 sop(10) bcz x 是一个完美的常量,这意味着在字节码类 Y 中不使用类 Z,所以在运行类 Y 时,类 Z 不是这就是为什么不执行 Z 类的 SIB 的原因。

于 2014-06-24T16:14:31.390 回答