黑马程序员技术交流社区

标题: java中有类型自动提升,但这个为什么可以通过呢? [打印本页]

作者: 快乐的黑马    时间: 2014-1-3 20:42
标题: java中有类型自动提升,但这个为什么可以通过呢?
byte和int类型整数相加的结果会变成int型,如果定义这个结果为byte型,那么编译不会通过,比如:byte b = b+1;有一次我看到下面这个试题:byte b = 1; b = b+=1;这个就编译运行都可以,为什么呢?求大神解答

public class Test3 {
        public static void main(String[] args) {
            
                         byte b = 1; b = b += 1; //(编译运行都ok)

                         //byte b = 1; b = b + 1; 编译不通过

                         System.out.println(b);
        }
      
}

作者: 程玉习    时间: 2014-1-3 20:51
因为 += 和 -= 运用时会进行自动提升,简单的赋值运算是不可以的,是需要强转的。
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.                 {
  5.             
  6.                         //byte b = 1; b = b += 1; //自动强转

  7.                         //System.out.println(b);

  8.                         byte b = 1;
  9.                        
  10.                         b = (byte)(b + 1); //需要强转

  11.                         System.out.println(b);
  12.         }
  13.       
  14. }
复制代码

作者: 其LovE斤    时间: 2014-1-3 20:54
本帖最后由 其LovE斤 于 2014-1-3 20:55 编辑

byte b = 1; b = b += 1; //(编译运行都ok)

byte b = 1; b = b + 1; 编译不通过

byte b = 1; 为什么通过就不说了。
b = b += 1  和  b = b + 1; 是有区别的:

b = b += 1  
b= (b+=1):
因为   b+=1 是一个复合赋值表达式,在其内部有一个自动转换动作。然后再将b=b 是正确的。
=号右边的转换成左边的数据类型,高类型->低类型 自动转化格式
是java中唯一的高类型向低类型自动转换   (b+=1)执行完是一个byte类型

b = b + 1;
b在这里是变量,是byte类型的变量,1是int型的。编译器将b提升为int型的。然后和1相加
(b+1) 但是“=”右边是变量的情况下,变量代表的是一片内存空间,无法判断是否在byte
范围内。int在内存中占4个字节,byte是占1个字节,左边放不下,错误,报的是  数据精度丢失。






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2