Java中的自動拆裝箱
public void assignment(){
int a = 1;
Integer b = a;
Integer c = 1;
int d = c;
int e = a + b;
Integer f = c + d;
System.out.println(e);
System.out.println(f);
}
public void assignment();
Code:
0: iconst_1
1: istore_1
2: iload_1
3: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
6: astore_2
7: iconst_1
8: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
11: astore_3
12: aload_3
13: invokevirtual #3 // Method java/lang/Integer.intValue:()I
16: istore 4
18: iload_1
19: aload_2
20: invokevirtual #3 // Method java/lang/Integer.intValue:()I
23: iadd
24: istore 5
26: aload_3
27: invokevirtual #3 // Method java/lang/Integer.intValue:()I
30: iload 4
32: iadd
33: invokestatic #2 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
36: astore 6
38: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
41: iload 5
43: invokevirtual #5 // Method java/io/PrintStream.println:(I)V
46: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
49: aload 6
51: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
54: return
public void compare(){
Integer a = 129;
Integer b = 129;
int c = 129;
Integer e = 127;
Integer f = 127;
System.out.println(a == b);
System.out.println(a == c);
System.out.println(a.equals(c));
System.out.println(e == f);
}
要想知道都在哪些地方做了類型轉換,還是需要看看編譯後的指令,只不過指令代碼有點長不做粘貼了。最後的結論是,比較a和c時,把a拆箱成了int值。也就是==比較包裝類和基本類型時,把包裝類型拆箱成了基本類型。