我很感激this answer为了这个想法。
下面的代码编译,但肯定不应该。它在初始化之前使用 x
的值。如果删除 StaticAssign.
限定符,它将不再编译。
public class StaticAssign {
public static final int x;
static {
System.out.println(StaticAssign.x);
x = 5;
}
public static void main(String[] args) {}
}
在我的机器上,这始终打印 0
。如果我将 x
的类型更改为 String
,它会始终打印 null
。
问题是:它肯定会打印 0
或 null
,还是它可能会访问未初始化的内存并打印出其他内容?
即使这段代码通过了编译器,为什么 JVM 不接收它?
有没有办法基于此做一些令人讨厌的事情?
最佳答案
它实际上已经被初始化了。全局范围内的变量会自动初始化。 Object 类型的变量将被初始化为 null 原语,如 int 将被初始化为 0。必须初始化不在全局范围内声明的变量,即。在方法中声明。另一个问题是将它声明为 final
这告诉编译器它必须被显式初始化。因此,通过添加 x=5
,您可以绕过编译器错误,指出它必须显式初始化。当您在运行时在此行之前访问它时,它会像全局范围内的任何其他原始 int 类型变量一样被初始化为 0。
关于java - 在 Java 中访问未初始化的静态字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27507008/