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) のこれらすべての初期化値が冗長であることを認識し、それらを省略していると思いました。
しかし突然、この 2 つのクラスに対して 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 オプションはありません