为什么我的静态代码块不执行?

San*_*pp1 4 java static

我正在尝试运行此代码,但我发现了final的这种行为与静态:代码运行时没有执行A的静态块.请提供给我原因.

class A {
  final static int a=9;
    static { //this block is not executing ??
      System.out.println("static block of A");
     }
}

class Manager {
  static {
    System.out.println("manager sib");
  }

  public static void main(String ...arg) {
    System.out.println("main");
    System.out.println(A.a);
  }
}
Run Code Online (Sandbox Code Playgroud)

为什么A类的静态块不运行?

Jon*_*eet 7

问题是这A.a是一个常数变量.

原始类型或类型String的变量是final,并使用编译时常量表达式(第15.28节)初始化,称为常量变量.

因此,您的Manager.main方法编译完全如下:

public static void main(String ...arg) {
    System.out.println("main");
    System.out.println(9);
}
Run Code Online (Sandbox Code Playgroud)

没有真正的参考A.a,所以这个A类甚至不需要存在,更不用说初始化了.(您可以删除A.class并仍然运行Manager.)

如果您依赖于使用A.a来确保初始化类型,则不应添加no-op方法:

public static void ensureClassIsInitialized() {
} 
Run Code Online (Sandbox Code Playgroud)

然后从你的方法中调用main.尽管如此,这是非常不寻常的.