[bo][un]hwoarangzk[/un] 在 2008-7-31 09:30 的发言:[/bo]
+= 和 = 的区别,= 右边先计算好结果再给左边,算好结果会默认为int型的,但左边如果是byte和short型的变量就会出现无法转换的问题,但是+=就是直接将结果赋给左边,没有默认为int型这一步
个人不赞成这种理解方式:
1 无论=还是+=都会发生类型转换
2 应该只是语法检测问题,对于+=实际也是 x += y; <==> x = x+ y;知识jvm在解析
测试代码
public class Test {
private static byte x,y;
public static void main(String[] args) {
x = 2; y = 3;
x += y;
x = 2; y = 3;
x = (byte) (x + y);
}
}
编译后的代码是:
// Compiled from Test.java (version 1.5 : 49.0, super bit)
public class Test {
// Field descriptor #6 B
private static byte x;
// Field descriptor #6 B
private static byte y;
// Method descriptor #9 ()V
// Stack: 1, Locals: 1
public Test();
0
aload_0 [this]
1
invokespecial java.lang.Object() [11]
4
return
Line numbers:
[pc: 0, line: 1]
Local variable table:
[pc: 0, pc: 5] local: this index: 0 type: Test
// Method descriptor #18 ([Ljava/lang/String;)V
// Stack: 2, Locals: 1
public static void main(java.lang.String[] args);
0
iconst_2
1
putstatic Test.x : byte [19]
4
iconst_3
5
putstatic Test.y : byte [21]
[bo]
8 getstatic Test.x : byte [19]
11 getstatic Test.y : byte [21]
14 iadd
15 i2b
16 putstatic Test.x : byte [19][/bo]
19
iconst_2
20
putstatic Test.x : byte [19]
23
iconst_3
24
putstatic Test.y : byte [21]
[bo]
27 getstatic Test.x : byte [19]
30 getstatic Test.y : byte [21]
33 iadd
34 i2b
35 putstatic Test.x : byte [19][/bo]
38
return
Line numbers:
[pc: 0, line: 4]
[pc: 8, line: 5]
[pc: 19, line: 6]
[pc: 27, line: 7]
[pc: 38, line: 8]
Local variable table:
[pc: 0, pc: 39] local: args index: 0 type: java.lang.String[]
}
x += y; 实际是红色代码
x = (byte) (x + y);
实际是淡红色代码
我们可以看到他们完全一致,可以想象他们都是完全相同的代码只是x = x + y;无法通过编译器检测,不过他的效果确实是x += y <==> x = x + y
[[it] 本帖最后由 时空之蕊 于 2008-8-21 21:36 编辑 [/it]]