如果引用的静态字段是final,为什么不执行静态初始化程序

时间:2014-05-01 08:39:53

标签: java static final

class a
{
    static final  int a =5;
    static {
        System.out.println("hi");

    }
}
class b
{
    public static void main(String[] args) {
        System.out.println(a.a);
    }   

}

为什么静态块不运行,输出只是

  

5

如果我从类变量中删除final关键字,则会执行静态块并且输出变为

hi 
5

2 个答案:

答案 0 :(得分:5)

基本上发生的事情是基元和字符串上的static final组合导致它们被编译器内联,这可能阻止了静态初始化块的执行,因为永远不会加载a类由类加载器,在编译期间解析a.a

答案 1 :(得分:4)

因为带有关键字static final的变量是编译时常量,不会触发包含该字段的类的加载。

尝试在变量 a

上使用static final运行此代码
System.out.println(a.a)
a var = new a();

你可以看到输出

5
hi

当调用 a 时,不会触发静态块,但是当创建类的实例时,它会被触发。它可以由以下任何一个触发:

  • 创建了一个类的实例,
  • 调用类的静态方法
  • 分配了类的静态字段,
  • 使用非常量静态字段,或
  • 对于顶级类,执行词法嵌套在类中的断言语句。

与您的问题非常相似的问题可能会有所帮助: Static block in Java not executed