前言:
我们在编码的时候, 经常会使用到 a 加上一个数或者加上一个字符串, 然后再赋值回给 a . 那么 a=a+b 和 a+=b是相同的么?
情景1:
a, b 类型相同, 且都为值类型
@Test public void demo1() { int a = 10; int b = 11; a = a + b; System.out.println("a = a + b : " + a); a = 10; a += b; System.out.println("a += b : " + a); }
情景2:
a,b 类型相同, 且都为引用类型:
@Test public void demo2() { String a = "a"; String b = "b"; a = a + b; System.out.println("a = a + b : " + a); a = "a"; a += b; System.out.println("a += b : " + a); }
情景3:
a, b类型不同, 一个为值类型, 一个为字符串类型
@Test public void demo3() { String a = "a"; int b = 10; a = a + b; System.out.println("a = a + b : " + a); a = "a"; a += b; System.out.println("a += b : " + a); }
从上面看, 好像能得出结论, 没啥区别啊, 是把?
如果真是这样, 那么我试试 a,b都是值类型, 但是有效范围不同, 或者说长度不同. 看看是不是也是这样呢.
情景4:
a, b都是值类型,但是a长度小, b长度长
@Test public void demo4() { int a = 10; long b = 10L; a = a + b; System.out.println("a = a + b : " + a); a = 10; a += b; System.out.println("a += b : " + a); }
在编写的时候, 从编译器上, 已经能看到不同了.
尽管如此, 我还是运行一下看看.
报精度丢失错误, 因为 等号 要求两边的类型一致, 很明显, int + long , int 自动转为高精度数据long, 相当于 int = long + long , 这时候, 发现等号两边数据类型不一致啊, 怎么赋值啊.
这里其实就相当于写了 : int c = 10L;
看一下编译器怎么提示:
我们都知道 int -> long , 没有问题, 因为不会产生值失真. 但是如果把 long -> int , 是有可能产生 失真 的. 那电脑不能决定是否要给你截值, 除非我们手动告诉电脑, 我们就要这么玩.
int c = (int)10L;
我将a=a+b注释掉, 看看 a+=b行不行
运行成功了. 为啥 += 能成功呢?
从结果上看, += 肯定为我们做了类型转换, 否则也不会成功的. 最后给到精度小的值, 当然有溢出风险是肯定的.