前言
在 Java 程序中,不同的基本数据类型的值经常需要进行相互转换。 Java 语言所提供的七种数值类型之间可以相互转换,基本数据类型转换有两种转换方式:自动类型转换和强制类型转换。
自动类型转换(隐式类型转换)
将取值范围小的类型自动提升为取值范围大的类型 
当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时
int i = 'A';//char自动升级为intdouble d = 10;//int自动升级为doublebyte b = 127; //右边的整数常量值必须在-128~127范围内//byte bigB = 130;//错误,右边的整数常量值超过byte范围long num = 1234567; //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到数据类型转换long bigNum = 12345678912L;//右边的整数常量值如果超过int范围,必须加L,否则编译不通过
当存储范围小的数据类型与存储范围大的数据类型一起混合运算时,会按照其中最大的类型运算
int i = 1;byte b = 1;double d = 1.0;double sum = i + b + d;//混合运算,升级为double
当 byte、short、char 数据类型进行算术运算时,按照 int 类型处理
byte b1 = 1;byte b2 = 2;byte b3 = b1 + b2;//编译报错,b1 + b2自动升级为intchar c1 = '0';char c2 = 'A';System.out.println(c1 + c2);//113
强制类型转换(显示类型转换)
将取值范围大的类型强制转换成取值范围小的类型
🌰
将1.5 赋值到int 类型变量会发生什么?编译失败,肯定无法赋值
int i = 3.14; // 错误
想要赋值成功,只有通过强制类型转换,将double 类型强制转换成int 类型才能赋值
比较而言,自动转换是 Java 自动执行的,而强制转换需要自己手动执行
转换格式
数据类型 变量名 = (数据类型)被强转数据值;
当把存储范围大的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围小的变量时,需要强制类型转换,提示:有风险,可能会损失精度或溢出
//强制类型转换,损失精度int i = (int)3.14;double d = 1.2;//损失精度,0.2 没了int num = (int)d;int i = 200;//溢出,超出 byte 最大的 127byte b = (byte)i;
当某个值想要提升数据类型时,也可以使用强制类型转换
int i = 1;int j = 2;double shang = (double)i/j;
提示:这个情况的强制类型转换是没有风险的
特殊的数据类型转换
任意数据类型的数据与 String 类型进行“+”运算时,结果一定是 String 类型
System.out.println("" + 1 + 2); //12
但是 String 类型不能通过强制类型转换,转为其他的类型
String str = "123";int num = (int)str; //错误的//后面才能讲到,借助包装类的方法才能转int num = Integer.parseInt(str);
练习
1、练习题:判断如下代码是否编译通过,如果能,结果是多少?short s1 = 12;short s2 = 8;short s3 = s1 + s2;2、练习题:判断如下代码是否编译通过,如果能,结果是多少?short s1 = 12;short s2 = 8;byte s3 = (byte)(s1 + s2);3、练习题:判断如下代码是否编译通过,如果能,结果是多少?char c1 = '0';char c2 = '1';char c3 = c1 + c2;4、练习题:判断如下代码是否编译通过,如果能,结果是多少?char c1 = '0';char c2 = '1';System.out.println(c1 + c2);5、练习题:判断如下代码是否编译通过,如果能,结果是多少?int i = 4;long j = 120; //因为右边120默认是int类型,int的值赋值给long类型是可以的,会自动类型转换,但是要求这个int值不能超过int的存储范围,如果超过int的存储范围必须加L.double d = 34;float f = 1.2;//因为右边1.2默认是double类型,double的值是不能直接赋值给float的,要么加F要么使用强制类型转换。System.out.println(i + j + d + f);//最后是double6、练习题:判断如下代码是否编译通过,如果能,结果是多少?int i = 1;int j = 2;// 1/2 做 int 运算得 0,再自动转换成 double 0.0double d = i/j;System.out.println(d);
注意点
- 不能对 boolean 值进行转换
- 不能进行不相关类型的转换,比如字符串转成 int
- 高转低使用强制转换
- 强制转换可能存在溢出或精度问题
