作者:语雀@MSDCP-KJ(msdcp),CSDN@神兽汤姆猫

隐式转换

将数据类型中,取值范围小的数据,给取值范围大的类型赋值,可以直接赋值。

小的给大的

  1. int a =10;// int占4个字节
  2. double b =a;// double占 8个字节
  3. System.out.println(b);
  4. //输出:10.0

类型转换专题 - 图1
细节:如果小的数据类型和大的数据类型运算,小的会提升到大的之后,在进行运算。

  1. public class LeiXingZhuanHuan {
  2. public static void main(String[] args) {
  3. int a= 10;// 4个字节
  4. double b =12.3;// 8个字节
  5. double c = a+b;
  6. System.out.println(c);
  7. }//输出:22.3
  8. //a和b在运算的过程中,会先将a提升为double类型
  9. //当类型统一之后,在进行运算。
  10. //两个double运算,结果话说double
  11. //故,结果使用double接收

注意:byte、short、char三种类型在运算时,无论是否有更高的数据类型,都会提升为int,然后在进行运算

  1. public static void main(String[] args) {
  2. byte a = 10;
  3. byte b = 20;
  4. int c = a + b;
  5. System.out.println(c);
  6. }//输出:30
  7. //如果将int换位byte就会报错。故以后使用int即可

强制转换

把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量

格式:目标数据类型 变量名 =(目标数据类型)值或者变量
大的给小的
如果是这样:类型转换专题 - 图2
会报错不兼容,会损失精度。
那么如果我们非要强制使用byte呢,那么就需要强制转换,如图:
类型转换专题 - 图3
如果我们这样:类型转换专题 - 图4
也会损失,即小数点之后全部没有。
类型转换专题 - 图5
输出结果为:12
所以会损失精度。


需要注意的是Java是存在一种常量优化机制的,例如(byte a = 5 + 8;)即会在编译时会让5和8进行相加,然后自动判断13是否在byte的取值范围内。如果不在范围内,则会编译出错。在范围内,则通过编译。

总结

小的给大的可以,大的给小的只能强制转换。