为什么尝试打印未初始化的变量并不总是导致错误消息

7 浏览
0 Comments

为什么尝试打印未初始化的变量并不总是导致错误消息

有些人可能会发现这与Stack Overflow问题Will Java Final variables have default values?相似,但该答案并不能完全解决这个问题,因为该问题没有直接在实例初始化块中打印x的值。

问题出现在我试图在实例初始化块内直接打印x的值时,同时在块结束之前给x赋值:

情况1

class HelloWorld {
    final int x;
    {
        System.out.println(x);
        x = 7;
        System.out.println(x);    
    }
    HelloWorld() {
        System.out.println("hi");
    }
    public static void main(String[] args) {
        HelloWorld t = new HelloWorld();
    }
}

这会导致编译时错误,指出变量x可能尚未初始化。

$ javac HelloWorld.java
HelloWorld.java:6: error: variable x might not have been initialized
        System.out.println(x);
                           ^
1 error

情况2

我不是直接打印,而是调用一个函数来打印:

class HelloWorld {
    final int x;
    {
        printX();
        x = 7;
        printX();
    }
    HelloWorld() {
        System.out.println("hi");
    }
    void printX() {
        System.out.println(x);
    }
    public static void main(String[] args) {
        HelloWorld t = new HelloWorld();
    }
}

这个可以正确编译并输出

0
7
hi

这两种情况之间的概念差异是什么?

0