Java的数据类型在定义时就已经明确了,但程序中有时需要进行数据类型的转换,Java允许用户有限度地进行数据类型转换。数据类型转换方式分为自动类型转换和强制类型转换两种。

一、自动类型转换

自动类型转换也称隐式类型转换,指两种数据类型转换过程中不需要显式地进行声明。Java会在下列的条件成立时,自动做数据类型的转换:

(1)转换的两种数据类型彼此兼容。

(2)目标数据类型的取值范围比原类型大。

类型转换只限该行语句,并不会影响原先定义的变量类型,而且自动类型转换可以保持数据的精确度,不会因为转换而丢失数据内容。

Java支持自动类型转换的类型,如图所示:

自动类型转换示例说明如下:

byte b = 97; //声明byte型变量值为97

char c = b; //错误,byte类型不能自动类型转换为char类型

float f = b; //正确,byte类型能自动类型转换为float类型

double d = 'c'; //正确,char类型能自动类型转换为double类型

在Java中,任何基本类型的值和字符串进行链接运算“+”时,基本类型的值将自动类型转换为字符串类型,字符串用String类表示,是引用类型。具体示例如下:

String s = 97; //错误,不能直接将基本类型赋值给字符串

String str = 97 + ""; //正确,基本类型的值自动转换为字符串,""代表空字符串

二、强制类型转换

强制类型转换也称为显式转换,指两种数据类型转换过程中需要显式地进行声明。当转换的两种数据类型彼此不兼容,或者目标数据类型的取值范围小于原类型时,而无法进行自动类型转换,此时就需要进行强制类型转换,如例所示:

1 public class TestTypeCast {

2 public static void main(String args) {

3 int n = 128;

4 byte b = n;

5 System.out.println(b);

6 }

7 }

程序的运行结果如图所示:

图中出现了编译错误,提示第4行代码类型不兼容,出现这样错误的原因是将int转换到byte时,int类型的取值范围大于byte类型的取值范围,转换会导致精度损失,也就是用1个字节的变量来存储4个字节的变量值。

对第4行代码进行强制类型转换,修改为下面的代码:

byte b = (byte) n;

程序的运行结果如图所示:

当试图强制把取值范围大的类型转换为取值范围小的类型时,将会引起溢出,从而导致数据丢失。图2.10中运行结果为-128,出现这种现象的原因是,int类型占4个字节,byte类型占1个字节,将int类型变量强制转换为byte类型时,Java会将int类型变量的3个高位字节截断,直接丢弃,变量值发生了改变,如图所示:

以上是好程序员讲师的分析和解说,如果任何疑问欢迎留言,好程序员从平凡到卓越,为梦想而拼搏!

相关文章