class Test {
public static void main(String arg[]) {
System.out.println("**MAIN METHOD");
System.out.println(Mno.VAL); // SOP(9090);
System.out.println(Mno.VAL + 100); // SOP(9190);
}
}
class Mno {
final static int VAL = 9090;
static {
System.out.println("**STATIC BLOCK OF Mno\t: " + VAL);
}
}
我知道加载类时会执行一个static
block 。但在这种情况下,类 Mno
中的实例变量是 final
,因此 static
block 没有执行。
为什么会这样?如果我删除 final
,它能正常工作吗?
哪个内存将首先分配,static final
变量还是 static
block ?
如果由于 final
访问修饰符没有加载类,那么变量如何获得内存?
最佳答案
static final int
字段是一个编译时常量,它的值被硬编码到目标类中而不引用其来源;- 因此您的主类不会触发包含该字段的类的加载;
- 因此不执行该类中的静态初始值设定项。
具体的细节,编译后的字节码是这样对应的:
public static void main(String arg[]){
System.out.println("**MAIN METHOD");
System.out.println(9090)
System.out.println(9190)
}
一旦删除 final
,它就不再是编译时常量,并且上述特殊行为不再适用。 Mno
类按预期方式加载,并执行其静态初始化程序。
关于java - Java 中的静态 block 未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23200353/