自动类型转换
Java的8个基本数据类型可以进行混合运算。不同类型的数据在运算过程中,首先会自动转换为同一类型,然后才进行运算。数据类型可以根据占用存储空间大小分为高低级别,占用空间越小,级别越低,占用空间越大,级别越高。自动类型转换遵循低级到高级转换的规则。如图3.9所示。从左到右的数据类型不断升高,箭头指明了自动类型转换的规则。
图1 数据类型级别与自动转换规则
基本数据类型的自动类型转换会发生在以下几种情况:
l 变量赋值
当为变量赋值的数据类型与变量类型不一致,并且赋值的数据类型级别低于变量类型的级别时,自动数据类型转换会将赋值数据自动转换为变量的类型。
例如:
byte byteNum=23; // 声明byte类型变量
int intNum=byteNum; //把byte型数据赋值给int型变量
l 方法调用
把一个数值传递给方法的参数,并且这个数值的数据类型低于方法的参数变量的数据类型。
例如:
publicstaticvoid say(int num){
System.out.println("这是int类型数值:"+num);
}
publicstaticvoid main(String[] args) {
byte byteNum=23;
say(byteNum); // 把byte数值传递给方法的int参数
}
一元运算
在一元运算中(除了++和—运算符),如果操作数的类型低于int类型(即byte、short和char类型),则操作数会自动转换为int类型。
二元运算符
在二元运算中,所有低级的数据类型都会转换为运算中级别最高的数据类型。也就是说,如果有一个操作数是double类型,其他操作数都会自动转换为double类型。如果运算中最高的数据类型是float,其他操作数都会转换为float类型。如果最高的数据类型为long,那么所有操作数都会自动转换为long类型。如果最高的数据类型为int那么所有操作数都会自动转换成int类型。至于byte、short、char类型会自动转换为int或运算中最高的数据类型。
例 在项目中创建类Conversion,在主方法中创建不同数值型的变量,实现将各变量的自动类型转换。
public classConversion {
publicstatic voidmain(String[] args) {
byteb1=34; shorts1=123;
charc1='B'; inti1=40;
longl1=900L; floatf1=8.11F;
doubled1=3.1415926;
System.out.println("double/byte+char->double"+(d1/b1+c1));
System.out.println("long+short->long"+(l1+s1));
System.out.println("char+byte+short->int"+(c1+b1+s1));
System.out.println("float+b1/s1->float"+(f1+b1/s1));
System.out.println("int+double->double"+(i1+d1));
}
}
运行的结果如图2所示:
图2 实例执行结果
强制类型转换
当把高级别(即占用存储空间较大)的数据类型赋值给低级别(即占用存储空间较小)的数据类型时,必须进行的强制类型转换。其语法格式如下:
(类型)(表达式)
类型是要转换成的目标类型,例如int、short、double等。表达式是要转换的目标数据,它可以是任何基本类型的算术运算表达式。
例如:
long num=900L; // 900
short snum=(short)num; //900
long类型的数值900没有超过short类型的取值范围,所以short类型的变量“snum”完全容纳了强制类型转换后的数值。
基本数据类型的强制类型转换需要注意数据完整性的问题,当把高级的数据类型强制转换为低级的数据类型时,如果数值超出低级数据类型的取值范围,数值将被截取,导致数据丢失、不完整。
例如:
short snum=516; // 516
byte bnum=(byte)snum; // 4
snum是short类型,数据长度是16位,而bnum是byte类型,长度为8位。当snum强制转换为byte类型时,数值“516”超出了byte类型的取值范围,这是只能从short类型截取低8为的数据赋值给byte类型的bnum变量。如图1所示。
图1 short转换为byte时必须截取数据
这样就造成了数据丢失,所以在使用强制数据类型转换时,一定要倍加小心。
例将long类型数值强制类型转换为其他数据类型
public classPConversion {
public static void main(String[] args) {
long num=33333;
System.out.println("原数是:"+num);
System.out.println("转成int:"+(int)num);
System.out.println("转成short:"+(short)num);
System.out.println("转成byte:"+(byte)num);
System.out.println("转成float:"+(float)num);
System.out.println("转成char:"+(char)num);
}
}
实例运行结果如图2所示。
图2 实例运行结果