看看下面的代码:
class Foo{
public static int x = 1;
}
class Bar{
public static void main(String[] args) {
Foo foo;
System.out.println(foo.x); // Error: Variable 'foo' might not have been initialized
}
}
正如您所看到的,当尝试通过 未初始化本地变量 Foo foo;
代码访问静态字段 x
时,会产生编译错误: Variable 'foo' might not have been initialized
。
这样的 似乎很强大错误是有意义的,但是只有当我们意识到访问 static
成员时,JVM 实际上并不是 使用变量的 < strong > value ,而只是它的 < strong > type 。
例如,我可以用值 null
初始化 foo
,这样我们就可以毫无问题地访问 x
:
Foo foo = null;
System.out.println(foo.x); //compiles and at runtime prints 1!!!
这样的场景之所以能够工作,是因为编译器认识到 x
是静态的,并且将 foo.x
看作是像 Foo.x
一样编写的(至少我之前是这么认为的)。
那么为什么编译器突然坚持 foo
的值应该是 它将不会使用呢?
免责声明: 这不是在实际应用中使用的代码,而是在 Stack Overflow 中找不到答案的有趣现象,所以我决定询问一下。