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");
}
}
此代码始终打印10但不打印SB。为什么?
答案 0 :(得分: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");
}
}
您会看到SB
按预期打印。
答案 1 :(得分:5)
您正在使用静态最终常量变量。此变量将在编译时被实际常量值替换,以便提高性能。如果您查看已编译的二进制代码(是的,您不能;但从技术上讲是假设),它将类似于此:
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");
}
}
基于此代码,类Hello不会加载到RAM中。因此它不会打印SB。
答案 2 :(得分:-3)
当您创建类的实例时,将调用您的静态代码块。试试这个:
public class Test {
public static void main(String[] args) {
Hello h = new Hello();
System.out.println(Hello.a1);
}
}
class Hello {
static final int a1 = 10;
static {
System.out.println("SB");
}
}