我理解只声明但未初始化的Java对象默认为该null值,但为什么以下编译并打印出null?
String a;
System.out.println(a);
Run Code Online (Sandbox Code Playgroud)
从JLS第16节:
当对其值进行任何访问时,每个局部变量(第14.4节)和每个空白最终字段(第4.12.4节,第8.3.1.2节)必须具有明确赋值.
您的代码将用于非最终字段(实例或静态变量),因为它们按照4.12.5节初始化,但由于这个原因会导致局部变量的编译时错误.
如果a是原始变量,情况也是如此.这是一个简短但完整的程序,显示了所有这些:
class Test {
static int x;
static String y;
public static void main(String[] args) {
System.out.println(x);
System.out.println(y);
int lx;
String ly;
System.out.println(lx); // Compile-time error
System.out.println(ly); // Compile-time error
}
}
Run Code Online (Sandbox Code Playgroud)
删除非编译行后输出前两行:
0
null
Run Code Online (Sandbox Code Playgroud)