初始化字段为null与未初始化:有什么区别?

时间:2015-07-16 05:19:53

标签: java jvm javac bytecode

我想知道将null值分配给字段与不分配字段之间是否存在任何差异。

让我们编译简单的类(使用javac或ecj):

public class Test {
    Object obj;
}

现在让我们看看它的字节码:

$ javap -c Test.class
Compiled from "Test.java"
public class Test {
  java.lang.Object obj;

  public Test();
    Code:
       0: aload_0
       1: invokespecial #10                 // Method java/lang/Object."<init>":()V
       4: return
}

现在让我们初始化字段:

public class Test {
    Object obj = null;
}

现在构造函数体看起来不同了:

Compiled from "Test.java"
public class Test {
  java.lang.Object obj;

  public Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: aload_0
       5: aconst_null
       6: putfield      #2                  // Field obj:Ljava/lang/Object;
       9: return
}

两个编译器都不会简单地忽略初始化,而是在构造函数中添加一个显式的aconst_null/putfield。所以我的问题是:这个添加会有任何运行后果吗?我可以在运行时区分对象字段是初始化为null还是根本没有初始化?如果没有,为什么编译器不能忽略这种初始化?

0 个答案:

没有答案