Java不打印默认的未初始化值

时间:2013-09-28 15:50:24

标签: java

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

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

4 个答案:

答案 0 :(得分:5)

来自section 16 of the JLS

  

每个局部变量(§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中的字段。 引用类型的类属性(字段)(例如)可以不显式初始化,因为它们在对象构造之前保证是空初始化的(我的意思是构造函数代码执行)。这是您不会访问未初始化字段的保证。 关于本地方法字段没有这样的逻辑,所以你必须明确地这样做。