2.5 数据类型转换

在程序中经常会有不同类型的数值间的运算与赋值情况发生,这样的情况下会有数据类型的转换。数据类型转换可分为两种形式,一种隐式转换,另一种是显示转换。

从转换方式考虑,系统自动转换被称为隐式转换,人为强制转换被称为显示转换;从内存分布和精度方面来考虑,低精度向高精度转换的被称为隐式转换,这样内存不会溢出,高精度向低精度转换的被称为显示转换,这样内存会溢出,数据会损失。

数据类型转换的这个溢出过程可以使用如图2-10所示的场景来表示。高精度内存分布相当于大盒子中的气球分布,小精度内存分布相当于小盒子中的气球分布。小盒子中的气球进入大盒子,分布是允许的,不会出现气球溢出,而大盒子里面的气球进入小盒子,就会有分布遗漏,气球丢失的情况。

图2-10 气球在小盒子和大盒子中的分布传递

2.5.1 隐式转换

隐式转换是指从低级类型向高级类型的转换过程,这种转换方式系统自动完成,无须人为操作,因此,隐式转换也被称为自动转换。Java中的基本数据类型(除去布尔型)之间可以进行转换,这些类型按精度从“低”到“高”的排列顺序如图2-11所示。其中char类型比较特殊,它可以与部分int型数字兼容,且不发生精度变化。

图2-11 隐式转换兼容顺序图

【例2.8】隐式转换自动提升精度。创建ImplicitConversion类,让低精度变量与高精度变量同时做计算,查看计算结果属于哪种精度(源代码\ch02\2.8.txt)。

运行结果如图2-12所示。

图2-12 隐式转换运算结果

☆大牛提醒☆

当不确定不同类型之间的运算结果的类型时,可以单击结果变量名,在弹出的下拉列表中选择“Create local variable '结果变量名'”选项,系统就自动显示其数据类型,如图2-13所示。

图2-13 单击结果变量名显示数据类型

在Java中把低精度数据赋给高精度数据是可行的,但如果把高精度数据赋给低精度数据就会出错,如图2-14所示。这种情况在开发程序时经常发生,这就需要用到显式转换了。

图2-14 float型不能转换成long型

2.5.2 显式转换

当把高精度变量的值赋给低精度变量时,必须使用显式类型转换,也被称为强制类型转换,当执行显式类型转换时可能会导致精度丢失。语法如下:

     (类型名)要转换的值

☆大牛提醒☆

显式类型转换通常都会导致存储精度的损失,所以使用时需要谨慎。

【例2.9】显式转换实现精度丢失。创建ExlpicitConversion类,使用显式转换将不同类型的变量转换成精度更低的类型,输出转换后的结果(源代码\ch02\2.9.txt)。

运行结果如图2-15所示。

图2-15 显式转换运算结果

☆大牛提醒☆

当把整数赋值给一个byte、short、int、long型变量时,不可以超出这些变量的取值范围,否则必须进行显式转换。例如:byte型变量的取值范围是-128~127,如果把129赋值给byte型变量,就必须进行显式转换,语句如下:

     byte b=(byte)129;