自动类型转换
Java的八种基本数据类型可以混合使用。在操作过程中,不同类型的数据会先自动转换为同一类型,然后再进行操作。数据类型可以根据所占存储空间的大小分为高、低两种级别。占用空间越小,层越低,占用空间越大,层越高。自动类型转换遵循从低级到高级转换的规则。如图3.9所示。从左到右的数据类型正在增加,箭头指示自动类型转换的规则。
图1数据类型级别和自动转换规则
基本数据类型的自动类型转换在以下情况下发生:
l变量分配
当分配给变量的数据类型与变量类型不一致,并且分配的数据类型的级别低于变量类型的级别时,自动数据类型转换会自动将分配的数据转换为变量的类型。
例如:
L方法调用
向方法的参数传递一个值,该值的数据类型低于该方法的参数变量的数据类型。
例如:
公共静态void say(int num){
系统。出来。println(“这是一个int值:”+num);
}
publicstatic void main(字符串参数){
字节byteum=23;
say(bytenum);//将字节值传递给方法的int参数
}
一元运算
在一元运算中(除+和-运算符外),如果操作数的类型低于int(即byte、short和char),则操作数将自动转换为int。
L二元运算符
在二进制操作中,所有低级数据类型都转换为操作中的最高级别数据类型。也就是说,如果一个操作数是double类型,其他操作数将自动转换为double类型。如果操作中的最高数据类型是float,则其他操作数将转换为float类型。如果最高的数据类型是long,则所有操作数都将自动转换为long。如果最高数据类型为int,则所有操作数都将自动转换为int。对于byte、short、char类型,它们将自动转换为int或操作中的最高数据类型。
在工程实例中创建一个转换类,在主方法中创建不同的数值变量,实现变量的自动类型转换。
q
BYTEB1=34;
缺点1=123;
CHARC1=“B”;
iTI1=40;
LYL1= 900L;
floatf1=8.11f;
加倍1=3.1415926;
系统。出来。println(“双/字节+字符->;双T”+(d1/b1+c1));
系统。出来。println(“长+短->;长T”+(l1+s1));
系统。出来。println(“char+byte+short->;int t”+(c1+b1+s1));
系统。出来。println(“float+b1/s1->;float t”+(f1+b1/s1));
系统。出来。println(“int+double->;double t”+(i1+d1));
}
}
操作结果如图2所示。
图2。示例执行结果
强制类型转换
在将高级数据类型(即占用较大的存储空间)分配给低级数据类型(即占用较小的存储空间)时,必须执行强制类型转换。其语法格式如下:
(类型)(表达式)
类型是要转换的目标类型,如int、short、double等。表达式是要转换的目标数据,可以是任何基本类型的算术表达式。
例如:
短snum=(short)num;//900
长类型900的值不超过短类型的值范围,因此短类型变量“snum”完全适应强制类型转换后的值。
基本数据类型的强制类型转换需要注意数据完整性。当低级数据类型必须使用高级数据类型时,如果该值超过低级数据类型的值范围,则会截取该值,从而导致数据丢失和不完整。
例如:
短snum=516;//516
bytebnum=(byte)snum;//4
snum是短类型,数据长度为16位,bnum是字节类型,长度为8位。当snum被强制转换为字节类型时,值“516”超过字节类型值的范围。这是一个bnum变量,只能通过截取低至8的短类型的数据来分配给字节类型。如图1所示。
图1。将short转换为byte时必须截取数据
这会导致数据丢失,因此在使用强制数据类型转换时要小心。
示例将长类型数字强制类型转换为其他数据类型
公共类conversion{
公共静态void main(字符串参数){
长数=33333;
system.out.println(“原始编号为:”+num);
系统。出来。println(“to int:”+(int)num);
转换为短:“+(短)num”;
转换为字节:“+(byte)num”;
转换为float:“+(float)num”;
转换为char:“+(char)num”;
}
}
示例的运行结果如图2所示。
图2运行结果示例