我们都知道,根据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 选项