看看下面的代码:
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。
这个错误看起来似乎是有道理的,但只有当我们意识到要访问成员时,staticJVM 实际上并不使用变量的值,而只使用其类型。
例如,我可以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 上找不到答案,所以我决定询问一下。
白板的微信
米脂
慕的地10843
SMILET
相关分类