前言

在 Java 程序中,不同的基本数据类型的值经常需要进行相互转换。 Java 语言所提供的七种数值类型之间可以相互转换,基本数据类型转换有两种转换方式:自动类型转换和强制类型转换。

自动类型转换(隐式类型转换)

取值范围小的类型自动提升为取值范围大的类型
image.png

当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时

  1. int i = 'A';//char自动升级为int
  2. double d = 10;//int自动升级为double
  3. byte b = 127; //右边的整数常量值必须在-128~127范围内
  4. //byte bigB = 130;//错误,右边的整数常量值超过byte范围
  5. long num = 1234567; //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到数据类型转换
  6. long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,否则编译不通过

当存储范围小的数据类型与存储范围大的数据类型一起混合运算时,会按照其中最大的类型运算

  1. int i = 1;
  2. byte b = 1;
  3. double d = 1.0;
  4. double sum = i + b + d;//混合运算,升级为double

当 byte、short、char 数据类型进行算术运算时,按照 int 类型处理

  1. byte b1 = 1;
  2. byte b2 = 2;
  3. byte b3 = b1 + b2;//编译报错,b1 + b2自动升级为int
  4. char c1 = '0';
  5. char c2 = 'A';
  6. System.out.println(c1 + c2);//113

强制类型转换(显示类型转换)

取值范围大的类型强制转换成取值范围小的类型

🌰

1.5 赋值到int 类型变量会发生什么?编译失败,肯定无法赋值

  1. int i = 3.14; // 错误

想要赋值成功,只有通过强制类型转换,将double 类型强制转换成int 类型才能赋值

比较而言,自动转换是 Java 自动执行的,而强制转换需要自己手动执行

转换格式

  1. 数据类型 变量名 = (数据类型)被强转数据值;

当把存储范围大的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围小的变量时,需要强制类型转换,提示:有风险,可能会损失精度或溢出

  1. //强制类型转换,损失精度
  2. int i = (int)3.14;
  3. double d = 1.2;
  4. //损失精度,0.2 没了
  5. int num = (int)d;
  6. int i = 200;
  7. //溢出,超出 byte 最大的 127
  8. byte b = (byte)i;

当某个值想要提升数据类型时,也可以使用强制类型转换

  1. int i = 1;
  2. int j = 2;
  3. double shang = (double)i/j;

提示:这个情况的强制类型转换是没有风险的

特殊的数据类型转换

任意数据类型的数据与 String 类型进行“+”运算时,结果一定是 String 类型

  1. System.out.println("" + 1 + 2); //12

但是 String 类型不能通过强制类型转换,转为其他的类型

  1. String str = "123";
  2. int num = (int)str; //错误的
  3. //后面才能讲到,借助包装类的方法才能转
  4. int num = Integer.parseInt(str);

练习

  1. 1、练习题:判断如下代码是否编译通过,如果能,结果是多少?
  2. short s1 = 12;
  3. short s2 = 8;
  4. short s3 = s1 + s2;
  5. 2、练习题:判断如下代码是否编译通过,如果能,结果是多少?
  6. short s1 = 12;
  7. short s2 = 8;
  8. byte s3 = (byte)(s1 + s2);
  9. 3、练习题:判断如下代码是否编译通过,如果能,结果是多少?
  10. char c1 = '0';
  11. char c2 = '1';
  12. char c3 = c1 + c2;
  13. 4、练习题:判断如下代码是否编译通过,如果能,结果是多少?
  14. char c1 = '0';
  15. char c2 = '1';
  16. System.out.println(c1 + c2);
  17. 5、练习题:判断如下代码是否编译通过,如果能,结果是多少?
  18. int i = 4;
  19. long j = 120; //因为右边120默认是int类型,int的值赋值给long类型是可以的,会自动类型转换,但是要求这个int值不能超过int的存储范围,如果超过int的存储范围必须加L.
  20. double d = 34;
  21. float f = 1.2;//因为右边1.2默认是double类型,double的值是不能直接赋值给float的,要么加F要么使用强制类型转换。
  22. System.out.println(i + j + d + f);//最后是double
  23. 6、练习题:判断如下代码是否编译通过,如果能,结果是多少?
  24. int i = 1;
  25. int j = 2;
  26. // 1/2 做 int 运算得 0,再自动转换成 double 0.0
  27. double d = i/j;
  28. System.out.println(d);

注意点

  • 不能对 boolean 值进行转换
  • 不能进行不相关类型的转换,比如字符串转成 int
  • 高转低使用强制转换
  • 强制转换可能存在溢出或精度问题