关于问题short s1 = 1; s1 = s1 + 1;出现编译错误,而 short s1 = 1; s1 += 1;不出现编译错误。

对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
对于short s1 = 1; s1 += 1;由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
有以下测试:

class Test
{
    public static void main(String[] a){
        System.out.println("Hello World!");
        short s = 1;
        s += 1;
        System.out.println(a);

    }
}

正确编译,没有问题。
通过反编译后得到代码:

import java.io.PrintStream;

class Test
{
  public static void main(String[] paramArrayOfString)
  {
    System.out.println("Hello World!");
    int i = 1;
    i = (short)(i + 1);
    System.out.println(paramArrayOfString);
  }
}

可以发现,编译器自动进行了强制类型转换,所以可以编译通过。

另有解释“因为byte、 short、 int 不会互相转换,它们三者在计算时会转换成 int 类型。 而“+”是算术运算符,有算术运算符,就是已经在运算了,所以结果会转成int 类型。 如果把 int 类型的结果赋给 byte、short类型的结果,必须加上强制声明。 所以, 上面的第一个语句块,错在用“+”这个算术运算符运算后,结果变成了 int 型, 然后重新把计算结果赋给 short 型的变量时,没有强制声明值为 short的型的,所以会出错。 应该更改为: short s1 = 1; s1 = (short)s1 + 1; 而第二个语句块,s1 += 1; 不会出错,因为“+=”是赋值运算符,不牵涉与其它类型的数字计算,也不会转成 int 类型的,所以没错。”(参考自http://zhidao.baidu.com/link?url=3kyYjOxXhML4Z1bRElTc_e6mFUS9ydne0Uf2t-xGPBJ983WZFAEvh8VfQAOq9RT2PksYUdCINLOAiJsjd2CTRQcLTapMaI0cmlq1-vJNtpm)

可能因为“+=”是赋值运算符,java有一定的处理机制,具体原理不详。

你可能感兴趣的:(Java)