为什么我的静态代码块不执行?
我正在尝试运行此代码,但我发现了最终的静态行为:代码运行时没有执行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) { // ... } }