3

我了解仅声明但未初始化的Java对象默认为该null值,但是为什么以下编译并打印出null?

String a;
System.out.println(a);
4

4 回答 4

5

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
    }
}

删除非编译行后前两行的输出:

0
null
于 2013-09-28T15:55:36.917 回答
4

默认情况下初始化类的字段。

喜欢

class A {
  String a;

  public void doSomething() {
     System.out.println(a); //prints null
  }
}

但是局部变量必须显式初始化。因此,您上面的代码将不起作用,因为a必须显式初始化。

您可能需要阅读Java 语言规范,第4.12.5 节。变量的初始值,其中详细解释了此行为。

于 2013-09-28T15:54:22.407 回答
2

作为对象引用的实例变量始终初始化为 null。但是局部变量的情况并非如此。

您需要显式初始化局部变量。

例如

String a = null;
System.out.println(a);
于 2013-09-28T15:53:23.343 回答
0

java中的字段必须在访问它们之前进行初始化。引用类型(例如)的类属性(字段)不能显式初始化,因为它们保证在对象构造之前被空初始化(我的意思是构造函数代码执行)。这是您不会访问未初始化字段的保证。本地方法字段没有这样的逻辑,因此您必须明确地执行此操作。

于 2013-09-28T15:58:40.680 回答