自动类型转换

Java8个基本数据类型可以进行混合运算。不同类型的数据在运算过程中,首先会自动转换为同一类型,然后才进行运算。数据类型可以根据占用存储空间大小分为高低级别,占用空间越小,级别越低,占用空间越大,级别越高。自动类型转换遵循低级到高级转换的规则。如图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类型(即byteshortchar类型),则操作数会自动转换为int类型。

l         二元运算符

在二元运算中,所有低级的数据类型都会转换为运算中级别最高的数据类型。也就是说,如果有一个操作数是double类型,其他操作数都会自动转换为double类型。如果运算中最高的数据类型是float,其他操作数都会转换为float类型。如果最高的数据类型为long,那么所有操作数都会自动转换为long类型。如果最高的数据类型为int那么所有操作数都会自动转换成int类型。至于byteshortchar类型会自动转换为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  实例执行结果

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