本帖最后由 straw 于 2013-8-18 17:13 编辑
byte b = 1;
b = b + 1;
编译不过是因为类型不比配, "+" 在这里是一个运算符,只有int doubel float 等类型数据才有运算功能,所以
虚拟机会将b自动转换成int类型然后再与1相加,到这里"="右边已经是int类型了,而左边则还是byte类型,所以虚拟机就会包类型不比配异常!
如果把右边的结果强制转换成byte就可以了,如:b = (byte)b + 1;
(注意!)java中是有自动拆装箱功能,但是"="左右不能自动拆装的.如:String s=1;这样也是错误的.因为String类型变量不能应用一个非String类型的值.
而
byte b = 1;
b = b += 1;
这个能编译通过,同样也是因为"+"的作用,b += 1相当于b和1相加后在赋值给b,但在此过程中由于"+"的作用,虚拟机会将"+"两边的数据自动转换成int类型后
在进行相加计算.也就是我们实际看到的b += 1;中的变量b其实已经是转换成int类型的了.
在这里我们有个误区,就是认为b+=1同等于b=b+1,其实b+=1真实的运算过程是同等于b=(原b的声明类型)b+1.如果有兴趣的可以去翻看"+="在java中
算法的源代码就知道了.
|