2.2 数据类型间的转换

在日常生活中,斤和两都是重量单位,一斤可以转换为十两。在Java中,整型、浮点型等都是基本的数据类型,它们是能够进行数据类型转换的。下面介绍不同数据类型之间的数据转换方式。

2.2.1 自动转换

自动转换就是不需要明确指出所要转换的类型是什么,而是由Java虚拟机自动转换。转换的规则就是小数据类型变大数据类型,但大数据类型的数据精度有时会被破坏。下面看一段代码。

    //定义各种数据类型
    int i = 123;
    char c1 = 22;
    char c2 = 'c';
    byte b = 2;
    //自动转换的数据类型
    int n = b;
    long l = i;

请读者思考把byte类型转换成float类型时,为什么会影响数据的精度?

2.2.2 强制转换

强制转换是带有强制性的,明明不能自动转换,而强制性地进行转换。看下面的例子。

    //定义数据类型
    int i = 22;
    long L= 33;
    //强制转换数据类型
    char c = (char)i;
    int n = (int) L;

其中,i原来是一个int整型,但要将它强行转换成char字符型。同样I原来是一个long型,但要将它强行转换成int整型。通过前面的学习已经知道,long型的取值范围最大值可以为2的63次方减1,而int型的取值范围最大值只有2的31次方减1。所以如果L为一个大于2的31次方减1,在强制类型转换时就会丢失精度,使数值发生变化,这也是读者需要注意的地方。

注意:强制类型转换是会丢失精度的,经常会发生转换后数据发生变换的情况。但是在一些必要的地方又必须进行强制类型转换。所以要谨慎和准确地使用强制类型转换。

2.2.3 隐含转换

隐含转换和自动转换很相似,Java虚拟机根据数据类型的位数来判断此数据类型是否能装载此数据,如果能,Java就默认进行了转换。举例说明如下:

    //例子1
    byte b = 111;
    //例子2
    int i = 222;
    byte c = (byte) i;

上面语句中有两个转换,一个是111转换成byte类型的数据库,因为byte类型的数据位数能装载下111,所以能进行转,这就是隐含转换。把值为222的变量:转换成byte类型的变量c就不能进行隐含转换,因为能进行隐含转换的只能是常量而不能是变量。