首页 > 编程笔记
Java数据类型转换(自动类型转换+强制类型转换)
我们知道,每个变量都有自己特定的数据类型,那么如果一个数值跟变量的数据类型不匹配,能不能将该数值赋值给变量呢?
答案是可以的,因为 Java 中的变量可以进行数据类型转换。
虽然从结果来看数值并没有改变,但在计算机底层是两种完全不同的数据类型。由原来的 int 类型变为 double 类型,这一过程叫作自动类型转换,即程序会自动去识别数据类型并完成转换。
注意,自动类型转换对参与的数据类型是有要求的,并不是所有的数据类型之间都可以完成自动转换,只能由低字节向高字节进行转换,反之则不行。
上面的示例中,double 类型的存储空间为 8 字节,int 类型的存储空间为 4 字节,所以 int 类型可以自动转为 double 类型,但 double 类型不能自动转为 int 类型。
同时,浮点型(double、float)描述数值的精度比整型(short、int、long)高,或者说浮点型可以对数值进行更精确的描述,所以整型数据类型也可以自动转为浮点型,即使 long 为 8 字节,float 为 4 字节,不满足只能由低字节向高字节进行转换的原则,也同样可以完成自动转换。
我们说的自动类型转换只包括所有数值类型,不包括 char 和 boolean。基本数据类型自动转换的关系为:
实际上,double 类型可以转为 int 类型,只不过程序不会自动完成,需要我们手动干预进行强制转换。
分析如下的代码:
使用 Eclipse 进行编程,遇到不能自动转换数据类型的情况时,Eclipse 会自动提示错误并给出解决方案,如下图所示。
第 2 项和第 3 项都是将变量的数据类型进行修改,使得赋值变量和被赋值变量的数据类型保持一致,也可以解决不能自动转换的问题。
答案是可以的,因为 Java 中的变量可以进行数据类型转换。
自动类型转换
在下面的程序,我们把一个整数赋给 double 类型的变量:public class Test { public static void main(String[] args) { int num = 10; double num2 = num; System.out.println(num2); } }运行结果为:
10.0
可以看到,打印的结果是 10.0,即整数 10 现在已经变成了小数 10.0。虽然从结果来看数值并没有改变,但在计算机底层是两种完全不同的数据类型。由原来的 int 类型变为 double 类型,这一过程叫作自动类型转换,即程序会自动去识别数据类型并完成转换。
注意,自动类型转换对参与的数据类型是有要求的,并不是所有的数据类型之间都可以完成自动转换,只能由低字节向高字节进行转换,反之则不行。
上面的示例中,double 类型的存储空间为 8 字节,int 类型的存储空间为 4 字节,所以 int 类型可以自动转为 double 类型,但 double 类型不能自动转为 int 类型。
同时,浮点型(double、float)描述数值的精度比整型(short、int、long)高,或者说浮点型可以对数值进行更精确的描述,所以整型数据类型也可以自动转为浮点型,即使 long 为 8 字节,float 为 4 字节,不满足只能由低字节向高字节进行转换的原则,也同样可以完成自动转换。
我们说的自动类型转换只包括所有数值类型,不包括 char 和 boolean。基本数据类型自动转换的关系为:
byte -> short -> int -> long -> float -> double
举个简单的例子:public class Test { public static void main(String[] args) { byte num1 = 10; short num2 = num1; int num3 = num2; long num4 = num3; float num5 = num4; double num6 = num5; System.out.println(num1); //依次打印num2、num3、num4、num5、num6 } }运行结果为:
10
10
10
10
10.0
10.0
强制类型转换
前面提到 int 类型可以自动转为 double 类型,而 double 类型不能自动转为 int 类型,这句话其实是不严谨的,严格意义上来讲是错的。实际上,double 类型可以转为 int 类型,只不过程序不会自动完成,需要我们手动干预进行强制转换。
分析如下的代码:
public class Test { public static void main(String[] args) { double num = 10.5; int num2 = (int) num; System.out.println(num2); } }运行结果为:
10
通过结果可以看到 double 在转为 int 时会造成精度损失,由 10.5 变成了 10,小数点后全部丢弃,将浮点型数值强转为整型时,只保留小数点左边的数值,不会按照四舍五入的方式来完成整数位的进位。使用 Eclipse 进行编程,遇到不能自动转换数据类型的情况时,Eclipse 会自动提示错误并给出解决方案,如下图所示。
- Add cast to ‘int’:进行强制类型转换,点击之后会自动补全强制类型转换的代码。
- Change type of ‘num2’to ‘double’:将 num2 的数据类型改为 double。
- Change type of ‘num’to ‘int’:将 num 的数据类型改为 int。
第 2 项和第 3 项都是将变量的数据类型进行修改,使得赋值变量和被赋值变量的数据类型保持一致,也可以解决不能自动转换的问题。