关于a=a+1和 a +=1

看到一道java面试题:
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
那怎么回答呢,简单来说,short s1 = 1; s1 = s1 + 1;有错,s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。

但是为什么呢?google一下啦。
本来 a=a+b和a +=b是一样的。就单纯的执行这两条语句,不考虑编译器的优化的话,a=a+b的执行效率是低于a+=b的,因为它多进行了一步中间变量的操作,
而且会多占用一个变量的空间。而Java编译器默认对其进行了优化,优化之后两条语句都当做 a+=b来执行了,所以实际上是没有任何却别的。
在a,b类型不同时,是有区别的,会涉及后者会涉及到类型的自动转换(如上题)。

public class Mytest {

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

先编译一下,在反编译
得到

public class Mytest
{
  public static void main(String[] args)
  {
    short a = 1;
    int b = 2;

    a = (short)(a + b);
  }
}

了然~~。

posted @ 2015-10-12 14:28  sowings  阅读(308)  评论(0)    收藏  举报