Java的数据类型转换
-
由于Java是强类型语言,所以在进行某些运算的时候,需要用到类型转换
-
-
运算中,不同类型的的数据先转换为同一类型,然后再进行计算
1、优先级
-
不同的数据类型,容量(即可赋值的范围)不同,所以转换的优先级也不同,从低到高如下图,
注:浮点数类型的转化优先级要高于整数类型,所以float的容量小于long,但是仍然优先级高于long
2、强制转换
-
优先级从高到低的类型转换,必须使用强制转换
下图的数据类型转换方式,就是强制转换,把int类型的数据,强制转换为byte类型
-
但是上图的代码出现了一个问题,就是经过类型转换后,输出的结果出现了问题,如下图
-
int类型的变量i,赋值为128,正常输出也是128,但是转换为byte后,输出变成了-128,这是由于byte类型的可赋值范围是-128至127,int的赋值128,超出了byte类型的可赋值范围,这种超出可赋值范围的类型转换导致的输出错误,就叫做内存溢出,或者叫数据溢出。
-
在编程时,一定要避免出现会产生内存溢出的强制转换的操作。
3、自动转换
-
优先级从低到高的类型转换,可以使用自动转换
如下图,将int类型的变量,转换为double类型的变量,不需要任何额外的操作,系统自动完成转换,就叫自动转换
-
自动转换输出的结果如下图,int类型输出为128,double类型输出为128.0,是因为从整数类型转换成了浮点数类型,但对数据的精度没有影响
4、类型转换的注意事项
-
不能对布尔值类型进行转换,无论是将其他类型转换为布尔值类型,或者是将布尔值类型转换为其他类型,都会直接报错。如下图
-
不能把变量的数据类型转换为不相干的类型
-
把高容量(也就是高优先级)类型转换为低容量(也就是低优先级)类型时,需要使用强制转换。
-
转换的时候,可能会出现内存溢出,或者精度的问题。
上面已经说过内存溢出的问题,下图就是会影响精度的强制转换
如图,将浮点数23.49(double)和-45.59(float)强制转换为int类型,如下图
输出的结果变成了23和-45,小数点后面的内容会被直接省略,这就造成了数据的精度问题。
-
自动转换和强制转换的应用举例
因为所有的字符的本质都是数字,因为Uncode编码表的存在,所以字符类型char可以转换为整数类型int并参与计算,,计算之后的结果又可以转换为字符进行输入
如下图,定义一个char类型的变量c,赋值为字符‘a’,再定义一个int类型的变量n,赋值为c+1
因为int类型的优先级高于char类型,高转低可以自动转换,所以进行c+1的运算时,会进行自动转换,将字符'a'自动转换为Uncode表中对应的数字97,所以计算之后,输出变量n的值为98,之后再把n的值转换为char类型进行输出,因为int优先级高于char,高专低必须强制转换,所以必须加上(char),最后输出的是字符b,说明再Uncode编码表里,数字98对应的字符是b。
-
JDK7以上的新特性,数字之间可以用下划线“_”进行分割,方便识别,不会影响输出和数字的大小,如下图
输出的数字仍然是10亿
-
假设上面的t是一个人的年薪,那么计算这个人20年的总工资,就会出现问题,如下图
年薪t没有超出int类型的范围,年限y也没有超出int类型的范围,但是两者相乘的积超出了范围,于是造成了total变量的内存溢出,输出了一个负数,很明显这是错误的
-
如何避免这个错误呢?能否将total的数据类型修改为范围更大的整数类型long呢?结果如下图
-
很明显,转换total的数据类型并没有用,因为数据类型的计算是先转换再计算,因此t和y相乘,是先确认数据类型,彼此都是int类型,然后再进行计算,因此计算出的结果也已经是int类型了,已经因为内存溢出,而得出了错误的值,然后再将这个错误的值自动转换为long类型,而Long类型的赋值范围是包含了这个错误的负数值的,所以即便转化为long类型,也无法改变输出的错误结果。
-
正确的做法是,在计算之前,就就将t或者y的值先强制转化为long类型,当然也可以两个都强制转换,这样接下来的计算,也会将计算的结果直接转化为long类型,这样就避免了内存溢出造成得到错误的值,如下图
输出的结果为
-
事实证明,三种在计算过程前将参与计算的变量进行强制转化的方法,都是可以保证最后输出的值是正确的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!