为什么我们不能通过未初始化的局部变量访问静态内容?
看看下面的代码:
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
这个错误似乎是有道理的,但直到我们意识到要访问一个成员,JVM实际上并没有使用变量的值,而只使用它的类型。static
例如,我可以用值初始化,这将使我们能够毫无问题地访问:foo
null
x
Foo foo = null;
System.out.println(foo.x); //compiles and at runtime prints 1!!!
这样的场景之所以有效,是因为编译器意识到它是静态的,并且像这样对待它(至少到目前为止我是这样想的)。x
foo.x
Foo.x
那么,为什么编译器突然坚持要有一个它根本不会使用的值呢?foo
免责声明:这不是在实际应用中使用的代码,而是我在Stack Overflow上找不到答案的有趣现象,所以我决定询问它。