【发布时间】:2013-01-17 19:14:49
【问题描述】:
我们都知道,根据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 选项
【问题讨论】:
-
如果启用优化(如果我没记错的话)
-O,结果是否相同? -
它是
-O(大写),不过只是经过测试,并没有被优化掉。
标签: java bytecode compiler-optimization