为什么尝试打印未初始化的变量并不总是导致错误消息
为什么尝试打印未初始化的变量并不总是导致错误消息
有些人可能会发现这与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
这两种情况之间的概念差异是什么?