看下面的代码:
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
}
}
如您所见,尝试x
通过未初始化的局部变量Foo foo;
代码访问静态字段时会foo.x
生成编译错误:Variable 'foo' might not have been initialized
。
它可能看起来像这样的错误是有道理的,但直到我们意识到,访问static
成员的JVM不实际使用的价值变量,但只有它的类型。
例如,我可以foo
使用value进行初始化,null
这将使我们能够x
毫无问题地进行访问:
Foo foo = null;
System.out.println(foo.x); //compiles and at runtime prints 1!!!
之所以如此,x
是因为编译器意识到这是静态的,并foo.x
像对待其编写时一样对待Foo.x
(至少这是我到目前为止所认为的)。
那么,为什么编译器突然坚持要foo
一个根本不会使用的值?
免责声明:这不是在实际应用中使用的代码,而是一种有趣的现象,我在Stack Overflow上找不到答案,因此我决定对此进行询问。