### 自动类型转换

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=900L;

float f1=8.11F;

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 实例执行结果

技巧：要理解类型转换，大家可以这么想象，大脑前面是一片内存，源和目标分别是两个大小不同的内存块（由变量及数据的类型来决定），将源数据赋值给目标内存的过程，就是用目标内存块去套取源内存中的数据，能套多少算多少。