当尝试通过未初始化局部变量x
Foo foo;
访问静态字段foo.x
时,出现编译错误Variable 'foo' might not have been initialized
。
class Foo{
public static int x = 1;
public static void main(String[] args) {
Foo foo;
System.out.println(foo.x); // Error: Variable 'foo' might not have been initialized
}
}
它可能似乎像这样的错误是有道理的,但只有在我们意识到访问static
成员之前,编译器实际上并不使用变量的[[value,但是仅其type。
foo
初始化null
,这将使我们可以毫无问题地访问x
:Foo foo = null;
System.out.println(foo.x); //compiles and while running prints 1!!!
这种情况行得通,因为编译器意识到?]]x
是静态的,并且将foo.x
的编写方式像Foo.x
一样对待(至少这是我到目前为止所认为的)。那么,为什么编译器突然在该位置坚持[C0]具有值[[它将不使用
(免责声明:这不是在实际应用中使用的代码,只是一种有趣的现象,我在Stack Overflow上找不到答案,因此我决定对此进行询问。)]]
[尝试通过未初始化的局部变量Foo foo访问静态字段x时; foo.x我收到编译错误变量'foo'可能尚未初始化。类Foo {public static int x ...