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本身的值是没有发生变化的。
在强制类型转换中,如果是将浮点类型的值转换为整数,直接去掉小数点后边的所有数字;而如果是整数类型强制转换为浮点类型时,将在小数点后面补零。
运行结果: