为什么我们不能使用未初始化的局部变量从该变量的类型访问静态内容?

问题描述 投票:76回答:4

当尝试通过未初始化局部变量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 ...

java static initialization local-variables jls
4个回答
72
投票

如果字段是

静态


14
投票

3
投票
© www.soinside.com 2019 - 2024. All rights reserved.