我们都知道,根据
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."":()V
4: return
例如(2):
0: aload_0
1: invokespecial #1; //Method java/lang/Object."":()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选项