`

short s1 = 1; s1 = s1 + 1;有错而short s1 = 1; s1 += 1正确。为何?

阅读更多

     如果你认为表达式(x += i)只是表达式(x = x + i)的简写方式,这并不准确。这两个表达式都被称为赋值表达式。第二个表达式使用的是简单赋值操作符(=),而第一个表达式使用的是复合赋值操作符。Java语言规范中讲到,复合赋值(E1 op=E2)等价于简单赋值(E1=(T)((E1) op (E2))),其中T是E1的类型,除非E1只被计算一次。
      换句话说,复合赋值表达式自动地将所执行计算的结果转型为其左侧变量的类型。如果结果的类型与该变量的类型相同,那么这个转型不会造成任何影响。然而,如果结果的类型比该变量的类型要宽,那么复合赋值操作符将悄悄地执行一个窄化原生类型转换。
     因此,复合赋值表达式可能是危险的。为了避免这种令人不快的突袭,请不要将复合赋值操作符作用于byte、short或char类型的变量。 
     因为S1short型的,占2个字节,而1是int型的,占4个字节。在两个类型的值相加的时候,会发生自动类型的提升。也就是说s1+1后,其结果是int型的,而不是short型的,所以可以想想看,把4个字节的东西放在两个字节的空间里,肯定编译不通过。   
     后面的那个不会发生类型的提升,JAVA规范上说    e1+=e2    实际上是    e1=(T1)(e1+e2),其中T1是e1的数据类型。   s1+=1等效于   s1=(short)(s1+1),所以是正确的。

分享到:
评论

相关推荐

    JAVA面试题库大全.zip

    一. Java基础部分 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2、Java有没有goto?...为什么? 8、用最有效率的方法算出2乘以8等於几? 9、请设计一个一百亿的计算器 。。。。。

    Java面试宝典2014版

    为什么? 8、用最有效率的方法算出2乘以8等於几? 9、请设计一个一百亿的计算器 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11、"=="和equals方法究竟有什么区别?

    java面试题(题库全).doc

    s1+1 运算结果是 int 型,需要强制转换类型;short s1 = 1; s1 += 1;可以正确编译,自动类型提升。 7. Java 有没有 goto? goto 是 java 中的保留字,现在没有在 java 中使用。 8. int 和 Integer 有什么区别? ...

    java_ms.rar_Math Class_java collection

    java面试笔试题大汇总 ~很全面 ... 第十一,short s1 = 1 s1 = s1 + 1 有什么错? short s1 = 1 s1 += 1 有什么错?  面试题都是很变态的,要做好受虐的准备。   第十二,sleep() 和 wait() 有什么区

    java各大软件公司的面试题的集和

    为什么要有GC? 基础。 第九,String s = new String("xyz");创建了几个String Object? 第十,Math.round(11.5)等於多少? Math.round(-11.5)等於多少? 第十一,short s1 = 1; s1 = s1 + 1;有什么错?...

    java面试题,从基础到框架再到设计

    s1+1 运算结果是 int 型,需要强制转换类型;short s1 = 1; s1 += 1;可以正确编译,自动类型提升。 Java 基础 7. Java 有没有 goto? 答:goto 是 java 中的保留字,现在没有在 java 中使用。 8. int 和 Integer ...

    Java面试宝典

    为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、...

    java面试总结

    为什么? 9 8、用最有效率的方法算出2乘以8等於几? 9 9、请设计一个一百亿的计算器 9 10、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 11 11、"=="和equals方法究竟有什么区别? 11 12、...

    java笔试题

    22、char 型变量中能不能存贮一个中文汉字,为什么? 23、抽象类(abstract class)和接口(interface)有什么异同? 24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同? 25、Java 中会存在内存...

    java笔试题目以及部分答案

    为什么要有 GC? GC 是 Java 语言中的垃圾回收机制,用于自动管理内存。GC 可以减少内存泄露的风险,提高程序的稳定性。 9. String s = new String("xyz"); 创建了几个 String Object? String s = new String(...

    Java面试题全集.docx

    Java 面试题全集 Java 是一种广泛应用的编程语言,它具有面向...相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。 4. Java 有没有 goto?答案是有,但是目前版本的 Java 中没有使用goto 是 Java 中的保留字。

    Java基础面试题集.doc

    为什么要有GC? GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域...

    2013年最全的JAVA面试题集,内部资料,绝对能帮助到你,不要后悔哦。

    9. short s1 = 1; s1 =s1 + 1;有什么错? short s1 =1; s1 += 1;有什么错? (难度1级) 10.int和Integer有什么区别? (难度1级) 11.toString方法的概述 12. Object类的概述 13. Collection和Collections的区别?...

    java技术支持面试题

    为什么要有 GC? GC 是指垃圾回收,垃圾回收是指自动释放内存的机制,垃圾回收机制是为了避免内存泄露。 17. short s1 = 1; s1 = s1 + 1;有什么错?short s1 = 1; s1 += 1;有什么错? short s1 = 1; s1 = s1 + 1;...

    95道Java面试题全集含答案.docx

    由于 1 是 int 类型,因此 s1+1 运算结果也是 int 型,需要强制转换类型才能赋值给 short 型。而 short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于 s1 = (short)(s1 + 1);其中有隐含的强制类型转换。 Java ...

    java笔试题汇总版 java笔试题汇总版

    为什么? char类型变量可以存储一个中文汉字,因为char类型可以存储 Unicode 字符集中的任何字符,包括中文汉字。 8. 用最有效率的方法算出 2 乘以 8 等於几? 可以使用左移运算符,例如:`2 等於 16。 9. 请...

Global site tag (gtag.js) - Google Analytics