之前在学习python和c的时候,感觉两者没区别,今天在学习java的时候,也觉得没区别,认为a = a+b和a += b是一样的,但是,今天在听了一门课才发现在java中两者不一样。
区别:
在讨论两者区别之前首先会引出一个概念,就是java中的显式转换和隐式转换。首先我们先讲一下显式转换和隐式转换。
显式转换:
但如果程序要求一定要将某一类型的数据转换为另外一种类型,则可以利用强制类型转换运算符进行转换,这种强制转换过程称为显式转换。(百度百科)在java中,我们在对基础变量进行复制的时候就直接强制转换类型,这个就是显示转换。
byte i = (byte)129;
short j = (short)399;
同时注意,在java中,long类型在赋值的时候必须在末尾添加L或者l(推荐L,因为有时候会吧l当成1)
long i = 100L;
隐式转换
隐式转换就是系统默认的、不需要加以声明就可以进行的转换。一般情况下,数据的类型的转换通常是由编译系统自动进行的,不需要人工干预,所以被称为隐式类型转换。(百度百科)在java中例如以下都是隐式转换。
byte i = 10;
short j = 100;
在等式左边,10和100是默认int类型由于10和100都没有超出byte和short的范围,故在编译的时候编译器不会报错。但是一旦超出范围,则编译器就会报错。
byte i = 129;
输出
Error:(7, 18) java: 不兼容的类型: 从int转换到byte可能会有损失
在 a = a + b的时候,如果a是小于int类型的则编译器会报错。
byte i = 1;
i = i + 1;
编译:
Error:(5, 15) java: 不兼容的类型: 从int转换到byte可能会有损失
在编译器将右边的表达式结果计算出来后,和左边的变量类型比较精度,如果左边的变量精度低于右边的结果的精度,编译器会显式的报错,告诉程序员去强制转型。(所以i = i + 1出错)最后将表达式的结果复制到变量所在的内存区。
在a += b中则编译器不会报错
byte i = 1;
i += 1;
输出:
2
在对于a += b中编译器自动隐式直接将+=运算符后面的操作数强制装换为前面变量的类型,然后在变量所在的内存区上直接根据右边的操作数修改左边变量内存存储的二进制数值(所以 i += 1不报错)最后达到和赋值运算符相同的目的。与前者相比,由于后者是位操作,效率也较前者高。
这个问题有面试问过,注意这是个坑,一般初学者如果没有深入了解,都会认为这个是一样的,所以千万注意这个坑。
转载:https://blog.csdn.net/qq_24872841/article/details/101313196