日期:2014-05-20  浏览次数:20662 次

java中的+=
如下面的程序
class   Test
{
        public   static   void   main(String   args[])
        {
                short   s=1;
                s=s+1;
                s+=1;
        }
}
中s=s+1不对,但s+=1却可以通过,为什么?

------解决方案--------------------
我是这样理解的:

“1”这个常量,编译器在处理的时候是有一定智能性的,可以根据上下文,把它理解成“int 常量”或者是“short 常量”。

对于“赋值运算符(=)”,编译器按照被赋值变量的类型来理解“1”的类型;对于“累加赋值运算符(+=)”也是这样处理。所以语法上就没有问题了(不需要强制转换)。

对于“加法运算符(+)”,编译器总是把“1”当作“int 常量”来理解,所以 s+1 的结果是一个“int 型值”,所以 s=s+1 就需要强制转换了。
------解决方案--------------------
只要看看jvm指令就可以很容易理解了:
public class Test {

public static void main(String[] args) {
short a = 1;
a += 1;
}

}
它对应的jvm代码如下:
0: iconst_1 //将int型常量1加载到操作栈(即short a = 1;中的1)
1: istore_1 //将操作栈中的值存储到变量(即存储到变量a中,a完成了初始化)
2: iload_1 //将变量(即a)的值加载到操作栈
3: iconst_1 //将int型常量1加载到操作栈(即 a += 1;中的1)
4: iadd //将操作栈中的两个值相加
5: i2s //将结果转换为short
6: istore_1 //将结果存储到变量(即存储到变量a中,a完成了运算)
7: return //方法结束返回。
第5行的代码执行了一个强制向下转型。