cha*_*tra 5 java static-initialization
public class Test {
public static void main(String[] args) {
System.out.println(Hello.a1);
}
}
class Hello {
static final int a1=10;
static {
System.out.println("SB");
}
}
Run Code Online (Sandbox Code Playgroud)
此代码始终打印10但不打印SB.为什么?
mzi*_*ard 10
甲static final字段被实现为一个编译时间常数,其在访问方法/类复制没有任何参考定义(其类)的环境中.这就是访问它不会触发静态类块的原因.
这基本上是由于final关键字.如果删除final如下:
public class Test {
public static void main(String[] args) {
System.out.println(Hello.a1);
}
}
class Hello{
static int a1=10;
static{
System.out.println("SB");
}
}
Run Code Online (Sandbox Code Playgroud)
您将看到SB按预期打印.
您正在使用静态最终常量变量.此变量将在编译时被实际常量值替换,以便提高性能.如果您查看已编译的二进制代码(是的,您不能;)但从技术上讲是假设)它将类似于此:
public class Test {
public static void main(String[] args) {
System.out.println(10); // Constant
}
}
class Hello {
static final int a1=10;
static {
System.out.println("SB");
}
}
Run Code Online (Sandbox Code Playgroud)
根据此代码,类Hello不会加载到RAM中.因此它不会打印SB.