![Java入门很轻松(微课超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/857/44509857/b_44509857.jpg)
2.5 数据类型转换
在程序中经常会有不同类型的数值间的运算与赋值情况发生,这样的情况下会有数据类型的转换。数据类型转换可分为两种形式,一种隐式转换,另一种是显示转换。
从转换方式考虑,系统自动转换被称为隐式转换,人为强制转换被称为显示转换;从内存分布和精度方面来考虑,低精度向高精度转换的被称为隐式转换,这样内存不会溢出,高精度向低精度转换的被称为显示转换,这样内存会溢出,数据会损失。
数据类型转换的这个溢出过程可以使用如图2-10所示的场景来表示。高精度内存分布相当于大盒子中的气球分布,小精度内存分布相当于小盒子中的气球分布。小盒子中的气球进入大盒子,分布是允许的,不会出现气球溢出,而大盒子里面的气球进入小盒子,就会有分布遗漏,气球丢失的情况。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P39_3515.jpg?sign=1739315679-vUALtRDowCfO6HA3cJCzR1QU3aPLXhlz-0-db7cefcf95d5f465d2d20dae0754b3a0)
图2-10 气球在小盒子和大盒子中的分布传递
2.5.1 隐式转换
隐式转换是指从低级类型向高级类型的转换过程,这种转换方式系统自动完成,无须人为操作,因此,隐式转换也被称为自动转换。Java中的基本数据类型(除去布尔型)之间可以进行转换,这些类型按精度从“低”到“高”的排列顺序如图2-11所示。其中char类型比较特殊,它可以与部分int型数字兼容,且不发生精度变化。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P39_49092.jpg?sign=1739315679-luH6xgA1rH7L0dC3NJuAYK2IXQkau948-0-a2d39fa8b5f1d9aeb48ce38345cd87c7)
图2-11 隐式转换兼容顺序图
【例2.8】隐式转换自动提升精度。创建ImplicitConversion类,让低精度变量与高精度变量同时做计算,查看计算结果属于哪种精度(源代码\ch02\2.8.txt)。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P40_49095.jpg?sign=1739315679-hfeYKFhdCM3BNFZb8s1zKm27rQ7XT4P8-0-052a2495acfed9a4c3ca3b4c0617b5f4)
运行结果如图2-12所示。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P40_3683.jpg?sign=1739315679-Gbwng7Anvl82I69KAMyJiHZRNeX99pcE-0-e1950f77a43d31be9d0e650615269db3)
图2-12 隐式转换运算结果
☆大牛提醒☆
当不确定不同类型之间的运算结果的类型时,可以单击结果变量名,在弹出的下拉列表中选择“Create local variable '结果变量名'”选项,系统就自动显示其数据类型,如图2-13所示。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P40_3692.jpg?sign=1739315679-BWj0KK5smm4vt5oYhv7KQByNRxCf0oKq-0-41f47ee94ccad98089ee4605526e42d9)
图2-13 单击结果变量名显示数据类型
在Java中把低精度数据赋给高精度数据是可行的,但如果把高精度数据赋给低精度数据就会出错,如图2-14所示。这种情况在开发程序时经常发生,这就需要用到显式转换了。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P41_3712.jpg?sign=1739315679-MHmnRKSolMD3XLS3VCupGsiZB4Lwnsz3-0-e2ad9da59c0cce081d0b9d1deddfe584)
图2-14 float型不能转换成long型
2.5.2 显式转换
当把高精度变量的值赋给低精度变量时,必须使用显式类型转换,也被称为强制类型转换,当执行显式类型转换时可能会导致精度丢失。语法如下:
(类型名)要转换的值
☆大牛提醒☆
显式类型转换通常都会导致存储精度的损失,所以使用时需要谨慎。
【例2.9】显式转换实现精度丢失。创建ExlpicitConversion类,使用显式转换将不同类型的变量转换成精度更低的类型,输出转换后的结果(源代码\ch02\2.9.txt)。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P41_49098.jpg?sign=1739315679-Qe9NIeHERga9o80Ew0gUnufuCFbNMvyD-0-cf1955b07aae2be4180ee47bfc1448ec)
运行结果如图2-15所示。
![](https://epubservercos.yuewen.com/5D7B55/23721525401929906/epubprivate/OEBPS/Images/Figure-P41_3797.jpg?sign=1739315679-7Q6rE2msOm7j9njeZ7saBrvSP4svjRCs-0-5a1a3242e275674d51c28e1fba0a0607)
图2-15 显式转换运算结果
☆大牛提醒☆
当把整数赋值给一个byte、short、int、long型变量时,不可以超出这些变量的取值范围,否则必须进行显式转换。例如:byte型变量的取值范围是-128~127,如果把129赋值给byte型变量,就必须进行显式转换,语句如下:
byte b=(byte)129;