基本数据类型的转换
1、自动类型转换
也称隐式转换,扩展转换,将范围小的数据类型赋值给范围大的数据类型,编译器会自动进行转换。
例如:
byte b = 20;
int a = b; // 将byte类型赋值给int类型,编译器会自动将byte类型转化为Int类型
自动转换条件
(1)转换前后的数据类型要相互兼容。
(2)转换后的数据类型的表示范围大于转换前的类型。即扩大转换。注意
(1)Java中,由于boolean类型只能存放true或false,与数字及字符不兼容,因此,boolean类型不能与其他任何数据类型进行转换。
(2)Java在进行数值运算时,以尽量不损失精度(正确性)为准则。
例如:一个字符型变量(本质上是2Byte大小的整数)与一个整型变量(默认4Byte大小的整数)进行运算,在运算前,不同类型的操作数需要先转化成同一数据类型,然后再运算。因此,要先将字符型的变量转换为整型变量,否则将4字节整型变量转换为2字节的字符型,很有可能导致整型变量的值会溢出,从而导致计算错误。字符与整数是可使用自动类型转换的。
假设参与某种运算有两个不同的操作数(操作数1和操作数2),二者具有不同的数据类型,在运算操作之前,它们需要转换为同一数据类型,其相互转换的规则如下表所示。
下面看个例子:当两个数中有一个为浮点数时,其运算的结果会有什么样的变化。
public class Demo {
public static void main(String[] args) {
int a = 152;
float b = 24.1f;
System.out.println("a = " + a + "\n" + "b = " + b);
System.out.println("a/b = " + a/b);
}
}
【结果】
【结果分析】
从运行的结果可以看出,当两个数中有一个为浮点数时,其运算的结果会直接转换为浮点数。
当表达式中变量的类型不同时,Java会自动把较小的表示范围转换成较大的表示范围后,再做运算。
也就是说,假设有一个整数和双精度浮点数作运算,Java会把整数转换成双精度浮点数后再做运算,运算结果也会变成双精度浮点数。
2、强制类型转换
也称显式转换,窄化转换,将范围大的数据类型赋值给范围小的数据类型,也即将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型,有可能面临信息丢失的危险。
double d = 200.12312;
int a = (int)d; // 将double类型赋值给int类型,必须进行显式转换
【语法】(欲转换的数据类型)变量名;
int i = (double)20.1;
【例】
public class DefaultDemo {
public static void main(String[] args) {
int a = 152, b = 9;
float f1, f2, f3, f4;
System.out.println("a = " + a + "\n" + "b = " + b);
f1 = a/b;
f2 = (float)a/b; // 将整数a强制转换为浮点数,再与b相除
f3 = a/(float)b; // 将整数b强制转换为浮点数,再以a除之
f4 = (float)a/(float)b; // 将整数a,b同时强制转换为浮点数,再相除
System.out.println("f1 = a/b = " + f1);
System.out.println("f2 = (float)a/b = " + f2);
System.out.println("f3 = a/(float)b = " + f3);
System.out.println("f4 = (float)a/(float)b = " + f4);
}
}
【结果】
注意:当两个整数相除时,小数点后的数字会被截断(并不四舍五入),使得运算结果为整数。要想得到浮点数,必须将其中一个或两个数转换为浮点数。
由于在转换的过程中可能会丢失数据的精确度,因此Java并不会“自动”做这些类型的转换,此时就必须要做强制性的转换,例如 int x = (int)10.35(结果x=10),将double类型的值(10.35)强制转换为int类型(10),这样也丢失了很多的信息。