先由一个问题来引出后面的分析:
【示例1:num=num+N】
public class Demo {
public static void main(String[] args) {
byte num = 10;
num = num + 10;
System.out.println(num);
}
}
这行代码的输出结果是什么呢?
Error:java: 不兼容的类型: 从int转换到byte可能会有损失
编译时报错了,这个不难理解,数字10未加说明就是int类型,int类型和byte类型进行运算时,byte类型会自动提升成int类型,因此等号右侧的类型为int类型(byte + int => int),int类型赋值给byte类型就导致出错了。
那么,我们把int类型的10强转成byte类型,能否达到byte + byte ==> byte的效果呢:
public class Demo {
public static void main(String[] args) {
byte num = 10;
num = num+(byte)10; // 将int类型的10强转成byte类型
System.out.println(num);
}
}
编译后:
Error: java: 不兼容的类型: 从int转换到byte可能会有损失
依旧是同样的错误,这说明byte + byte 还是int,为什么会这样呢?
这是由于byte类型表示的范围太小了(-128~127),计算时容易造成溢出,为了避免溢出,byte类型在进行运算时会自动提升成int类型再进行运算。
上面的代码将int类型10强转换成byte类型,看似是byte和byte在进行运算,其实是int和int在进行运算,int +int 的结果当然是int类型了,要解决这个错误只需将其计算结果进行强转即可:
public class Demo {
public static void main(String[] args) {
byte num = 10;
num = (byte)(num+10); // 将结果强转为byte类型
System.out.println(num); // 20
}
}
现在这段代码编译运行,没有任何错误,输出的结果是20。
------------------------------------------------华丽的分割线-----------------------------------------------
【示例2:num+=N】
再来看看下面这段代码:
public class Demo {
public static void main(String[] args) {
byte num = 10;
num +=10;
System.out.println(num);
}
}
此代码的输出结果呢?
D:\javaDemo>javac Demo.java
D:\javaDemo>java Demo
num = 20
编译运行后正常输出。
这是因为复合赋值运算符里面隐含强制类型转换,num+=10才是真正等价于 num = (byte)(num + 10);
【强行总结】
- 当char、byte这种小类型在进行运算时会自动提升成int类型再进行运算。
- 复合赋值运算符里面隐含强制类型转换,如num+=N实际上是num = (int)(num + N);
- 为了避免不必要的麻烦,推荐使用复合赋值运算符。
此文是本人学习编程时的学习记录,若文中有不足之处,还请多多指教。