我正在尝试运行此代码,但我发现了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类的静态块不运行?
问题是这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.尽管如此,这是非常不寻常的.
| 归档时间: |
|
| 查看次数: |
402 次 |
| 最近记录: |