我想知道将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
还是根本没有初始化?如果没有,为什么编译器不能忽略这种初始化?