【Java】【数据类型/变量】数据类型转换
为保证数据在不同环境不同业务下使用尽可能准确,Java提供了数据类型转换机制。
1.字面量/直接量
在Java源码中出现的直接数据成为直接量或字面量,比如:
int int_100 = 100;// 100称为直接量/字面量
这里要明白一件事情,Java源程序会被JVM虚拟机加载运行,那么当程序运行到int int_100 = 100;这行语句时,在内存中需要创建100这个数据,那么这个数据是什么类型呢?
这就牵扯到字面量的类型问题。在Java中整数字面量默认是int类型,小数字面量默认是double类型。
2.字面量赋值
int int_100 = 100;// 整型100赋值给整型变量 byte byte_100 = 100;// 整型100赋值给字节型变量 short short_100 = 100;// 整型100赋值给短整型变量
情形①结论:整数字面量赋值范围较小的变量,如果数值在范围小的变量范围内,系统自动转换。
byte byte_127 = 128;// 这里会产生错误Type mismatch: cannot convert from int to byte byte byte_127 = (byte) 128;// 强制转换,数据溢出
情形②结论:整数字面量赋值范围较小的变量,如果数值不在范围小的变量范围内,系统无法自动转换。如果采用强制转换,则会出现数据溢出问题;所以应当避免这种情况的出现。
long l_123 = 123;// 整型123赋值给长整型变量 float f_123 = 123;// 整型123赋值单精度浮点型变量 double d_123 = 123;// 整型123赋值双精度浮点型变量
情形③结论:整数字面量赋值范围较大的变量,系统自动转换。
int int_max = 2147483648;// 错误:The literal 2147483648 of type int is out of range long int_max = 2147483648l;// 将字面量范围扩大到长整型
情形④结论:整型字面量最大值2147483647,上述超过最大值,报错数据越界,无法表示。处理方式:将字面量的范围扩大,可以写成2147483648l/2147483648L,即长整型字面量。
float f = 1.23;// 错误:Type mismatch: cannot convert from double to float float f2 = (float)1.23;// 强制转换 float f3 = 1.23f;// 将字面量转换成单精度浮点型
情形⑤结论:浮点数(小数)字面量类型为双精度浮点型double,赋值给float类型,范围变小,系统无法自动转换。可采用强制转换,一定会丢失精度并有可能出现数据溢出问题;也可缩小字面量的范围,可以写成1.23f/1.23F,即单精度浮点型字面量。
double d = 1.23; double d2 = 1.23d; double d3 = 1.23D;
情形⑥结论:双精度浮点型字面量可以加d/D标识,也可以不加,建议加上标识。
3.变量赋值
变量赋值以及变量之间的类型转换原则与字面量一样,我们着重考虑的是更安全地使用变量以及变量之间的类型转换。①考虑真是业务需求的数据范围;②考虑类型转换过程中可能带来的风险。
4.字符类型转换
字符类型是比较有趣的类型。我们可以这样进行字符类型变量赋值:
char cha1 = 'A';// 字符字面量赋值 char cha2 = 65;// 整型字面量赋值 System.out.println(cha1 + ":" + cha2);// 控制台输出A:A
首先,我们再强调一遍,字符类型属于无法号整数类型,范围在0~6W+;所以,字符类型是可以与数字类型之间进行转换的。这里我们要提到ASCII码表,上面记录了打印字符与数值之间的对应关系。其次,字符类型与其它数值数据类型之间的转换同样满足上述类型转换的原则。除了英文字母外,我们还比较关心字符类型表示中文字符字面量,举个栗子:
char cha3 = '一'; char cha4 = '我'; char cha5 = '耄'; // 这里我们将字符类型的变量强制转换成了整型,由于范围是扩大的,能保证数值的正确性 System.out.println((int) cha3 + ":" + (int) cha4 + ":" + (int) cha5); // 输出结果:19968:25105:32772
我们发现,越是结构简单的中文,对应的字符数值就越小。关于字符的数字范围,涉及到统一编码问题,在此不做深究。
5.布尔类型转换
布尔类型是不可以与其它任何类型进行转换的,切记。