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

在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换。

自动类型转换(隐式转换)

例如:

代码中int型变量score1可以直接为double型变量score2完成赋值操作,运行结果为:82.0 

这种转换称为自动类型转换

自动类型转换要满足以下2个条件:

- 两种数据类型彼此兼容。如:double型兼容int型,但是char型不能兼容int型

- 目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)。如:double类型长度为8字节,int 类型为4字节,因此double类型的变量里直接可以存放int类型的数据,但反过来就不可以了

 

在运算过程中,由于不同的数据类型会转换成同一种数据类型,所以整型、浮点型以及字符型都可以参与混合运算。自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下:

- 数值型数据的转换:byte→short→int→long→float→double。

- 字符型转换为整型:char→int。

以上数据类型的转换遵循从左到右的转换顺序,最终转换成表达式中表示范围最大的变量的数据类型。

运行结果:

从执行结果看出,float、int 和 double 三种数据类型参与运算,最后输出的结果为 double 类型的数据。这种转换一般称为“表达式中类型的自动提升”。

 

自动类型提升有好处,但它也会引起令人疑惑的编译错误。例如,下面看起来正确的程序却会引起问题:

byte b = 50;
b = b * 2;    // Type mismatch: cannot convert from int to byte

如上所示,第二行会报“类型不匹配:无法从int转换为byte”错误。

该程序试图将一个完全合法的byte型的值 50*2 再存储给一个 byte 型的变量。但是当表达式求值的时候,操作数被自动的提升为int型,计算结果也被提升为int型。这样表达式的结果现在是int型,不强制转换它就不能被赋为byte型。

此时,被赋的值将仍然适合目标类型。所以应该使用一个显式的强制类型转换,例如:

byte b = 50;
b = (byte)(b*2);

这样就能产生正确的值 100。

注意:char类型比较特殊,char自动转换成int、long、float和 double,但byte和short不能自动转换为 char,char也不能自动转换为byte或short。

 

强制类型转换(显式转换)

尽管自动类型转换是很有帮助的,但并不能满足所有的编程需要。例如:当程序中需要将double型变量的值赋给一个int型变量,该如何实现呢?

显然,这种转换是不会自动进行的。因为int型的存储范围比double型的小。这种转换为“缩小转换”,因此肯定要将源数据类型的值变小才能适合目标数据类型。

当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换

语法格式:(type)variableName

其中,type为variableName要转换成的数据类型,而variableName是指要进行类型转换的变量名称。

运行结果:

上述代码中首先将double类型变量b的值强制转换成int类型,然后将值赋给a,但是变量b本身的值是没有发生变化的。

在强制类型转换中,如果是将浮点类型的值转换为整数,直接去掉小数点后边的所有数字;而如果是整数类型强制转换为浮点类型时,将在小数点后面补零。

运行结果:

posted @ 2020-03-11 15:04  梦清欢  阅读(799)  评论(0编辑  收藏  举报