首页 > 编程笔记

Java数据类型转换(自动类型转换+强制类型转换)

我们知道,每个变量都有自己特定的数据类型,那么如果一个数值跟变量的数据类型不匹配,能不能将该数值赋值给变量呢?

答案是可以的,因为 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 会自动提示错误并给出解决方案,如下图所示。
第 2 项和第 3 项都是将变量的数据类型进行修改,使得赋值变量和被赋值变量的数据类型保持一致,也可以解决不能自动转换的问题。

推荐阅读