Java的8个基本数据类型可以进行混合运算。不同类型的数据在运算过程中,首先会自动转换为同一类型,然后才进行运算。数据类型可以根据占用存储空间大小分为高低级别,占用空间越小,级别越低,占用空间越大,级别越高。自动类型转换遵循低级到高级转换的规则。如图3.9所示。从左到右的数据类型不断升高,箭头指明了自动类型转换的规则。
图1 数据类型级别与自动转换规则
基本数据类型的自动类型转换会发生在以下几种情况:
l 变量赋值
当为变量赋值的数据类型与变量类型不一致,并且赋值的数据类型级别低于变量类型的级别时,自动数据类型转换会将赋值数据自动转换为变量的类型。
例如:
byte byteNum=23; // 声明byte类型变量
int intNum=byteNum; // 把byte型数据赋值给int型变量
l 方法调用
把一个数值传递给方法的参数,并且这个数值的数据类型低于方法的参数变量的数据类型。
例如:
public static void say(int num){
System.out.println("这是int类型数值:"+num);
}
public static void
main(String[] args) {
byte byteNum=23;
say(byteNum); // 把byte数值传递给方法的int参数
}
l 一元运算
在一元运算中(除了++和—运算符),如果操作数的类型低于int类型(即byte、short和char类型),则操作数会自动转换为int类型。
l 二元运算符
在二元运算中,所有低级的数据类型都会转换为运算中级别最高的数据类型。也就是说,如果有一个操作数是double类型,其他操作数都会自动转换为double类型。如果运算中最高的数据类型是float,其他操作数都会转换为float类型。如果最高的数据类型为long,那么所有操作数都会自动转换为long类型。如果最高的数据类型为int那么所有操作数都会自动转换成int类型。至于byte、short、char类型会自动转换为int或运算中最高的数据类型。
例 在项目中创建类Conversion,在主方法中创建不同数值型的变量,实现将各变量的自动类型转换。
public class Conversion {
public static void main(String[] args) {
byte b1=34;
short s1=123;
char c1='B';
int i1=40;
long l1=
float f1=
double d1=3.1415926;
System.out.println("double/byte+char->double\t"+(d1/b1+c1));
System.out.println("long+short->long\t\t"+(l1+s1));
System.out.println("char+byte+short->int\t\t"+(c1+b1+s1));
System.out.println("float+b1/s1->float\t\t"+(f1+b1/s1));
System.out.println("int+double->double\t\t"+(i1+d1));
}
}
运行的结果如图2所示:
图2 实例执行结果
技巧:要理解类型转换,大家可以这么想象,大脑前面是一片内存,源和目标分别是两个大小不同的内存块(由变量及数据的类型来决定),将源数据赋值给目标内存的过程,就是用目标内存块去套取源内存中的数据,能套多少算多少。