我了解仅声明但未初始化的Java对象默认为该null
值,但是为什么以下编译并打印出null?
String a;
System.out.println(a);
每个局部变量(第 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
}
}
删除非编译行后前两行的输出:
0
null
默认情况下初始化类的字段。
喜欢
class A {
String a;
public void doSomething() {
System.out.println(a); //prints null
}
}
但是局部变量必须显式初始化。因此,您上面的代码将不起作用,因为a
必须显式初始化。
您可能需要阅读Java 语言规范,第4.12.5 节。变量的初始值,其中详细解释了此行为。
作为对象引用的实例变量始终初始化为 null。但是局部变量的情况并非如此。
您需要显式初始化局部变量。
例如
String a = null;
System.out.println(a);
java中的字段必须在访问它们之前进行初始化。引用类型(例如)的类属性(字段)不能显式初始化,因为它们保证在对象构造之前被空初始化(我的意思是构造函数代码执行)。这是您不会访问未初始化字段的保证。本地方法字段没有这样的逻辑,因此您必须明确地执行此操作。