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

我正在尝试运行此代码,但我发现了最终的静态行为:代码运行时没有执行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(Aa); } } 

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

问题是Aa是一个常数变量 。

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

因此,您的Manager.main方法的编译方式与以下内容完全相同

 public static void main(String ...arg) { System.out.println("main"); System.out.println(9); } 

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

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

 public static void ensureClassIsInitialized() { } 

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

规范http://docs.oracle.com/javase/specs/jls/se7/jls7.pdf第4.12.1节说,

原始类型或类型String的变量是final,并使用编译时常量表达式(第15.28节)初始化,称为常量变量。 变量是否是常量变量可能对类初始化(第12.4.1节),二进制兼容性(第13.1节,第13.4.9节)和明确赋值(第16节)有影响。

由于您只访问常量,因此不需要类初始化。

你可以强制加载你需要的任何类:

 public final class ClassUtils { private ClassUtils() {} public static void forceLoad(Class... classes) { for (Class clazz : classes) { try { Class.forName(clazz.getName(), true, clazz.getClassLoader()); } catch (ClassNotFoundException e) { throw new AssertionError(clazz.getName(), e); } } } } class Manager { static { ClassUtils.forceLoad(A.class); // ... } public static void main(String ...arg) { // ... } }