解答: 
        首先, 
                是因为你对“+=”这个赋值运算符没有真正搞明白, 
                平时看到的书上讲得过于简单,没有给出s+=2;与s=s+2;有什么区别,所以使用起来你会郁闷。 
                其实很简单,记着就好了,不必深层次的理解。 
         
        其次, 
                可能你还没真正理解: 
                强制类型转换、隐含强制类型转换、自动类型转换  三者的概念。 
                 
 
解释如下: 
        short s = 3; 
        s = s + 2; 
编译失败原因: 
        如果一个整数没有赋给一个声明了数据类型的变量,这个整数在参加运算的默认类型就是int类型。 
        “2”这个整数的默认数据类型是int类型,当进行s+2运算时,s发生了数据自动提升,也就是自动类型转换。 
        即:s自动转换为与2相同的数据类型int类型,然后进行了加法运算, 
        两个int类型的数据相加后肯定还是一个int类型,最后赋给数据类型为short的s时,就发生了数据丢失。 
        相关知识: 
        Java在需要和允许的情况下,总是将变量向着更高精度类型的方向转换,这样不会引起数据丢失,这个过程叫做类型提升(类型自动提升)。 
        在没有进行强制装换的情况下,高位数的数据不能转换为低位数的数据,否则造成数据丢失。金字塔赋值顺序是不可逆转的! 
 
 
         
        s+=2; 
编译通过的原因: 
        因为“+=”运算符在给s赋值时,自动完成了强制类型转换操作, 
        综上所述,不能简单的认为,s+=2;与s = s + 2;不是等价的。 
        当short s = 3; 
        s+=2;与s = (short)(s + 2); 结果是一样的。 
        s+=2;与s = s + 2;                 执行过程不是一样的,前者通过,后者不能通过。 
         
         
拓展: 
                long l = 3; 
                l = l + 2; 
                System.out.println("l="+l); 
                可以通过编译,此时:l = l + 2;与l+=2;执行结果是一样的。 
 
 
 
                 
                 
                 
 
 
 |   
        
- 
add.jpg
(55.22 KB, 下载次数: 42)
 
 
基本类型变量间的赋值关系 
 
 
 
 
    
    
    
    
 
 
 |