我理解只声明但未初始化的Java对象默认为null
值,但为什么以下编译并打印出null?
String a;
System.out.println(a);
答案 0 :(得分:5)
每个局部变量(§14.4)和每个空白的最终字段(§4.12.4,§8.3.1.2)在对其值进行任何访问时都必须具有明确赋值。
您的代码将用于非最终字段(实例或静态变量),因为它们按section 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
}
}
删除非编译行后输出前两行:
0
null
答案 1 :(得分:4)
默认情况下会初始化类的字段。
像
class A {
String a;
public void doSomething() {
System.out.println(a); //prints null
}
}
但必须明确初始化局部变量。因此,上面的代码无效,因为a
必须显式初始化。
您可能需要阅读Java Language Specification部分4.12.5. Initial Values of Variables,其中详细说明了此行为。
答案 2 :(得分:2)
作为对象引用的实例变量始终初始化为null。但局部变量的情况并非如此。
您需要显式初始化局部变量。
e.g。
String a = null;
System.out.println(a);
答案 3 :(得分:0)
在访问java之前,必须先初始化java中的字段。 引用类型的类属性(字段)(例如)可以不显式初始化,因为它们在对象构造之前保证是空初始化的(我的意思是构造函数代码执行)。这是您不会访问未初始化字段的保证。 关于本地方法字段没有这样的逻辑,所以你必须明确地这样做。