默认变量的值与默认初始化
2022-09-02 10:07:26
我们都知道,根据 JLS7 p.4.12.5,每个实例变量都使用默认值进行初始化。例如 (1):
public class Test {
private Integer a; // == null
private int b; // == 0
private boolean c; // == false
}
但我一直认为,这样的类实现(2):
public class Test {
private Integer a = null;
private int b = 0;
private boolean c = false;
}
绝对等于示例 (1)。我预料到,复杂的Java编译器看到(2)中的所有这些初始化值都是多余的,并省略了它们。
但是突然之间,对于这两个类,我们有两个不同的字节码。
例如 (1):
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
例如 (2):
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: aload_0
5: aconst_null
6: putfield #2; //Field a:Ljava/lang/Integer;
9: aload_0
10: iconst_0
11: putfield #3; //Field b:I
14: aload_0
15: iconst_0
16: putfield #4; //Field c:Z
19: return
问题是:为什么?但这是需要优化的显而易见的事情。原因何在?
UPD:我使用Java 7 1.7.0.11 x64,没有特殊的javac选项