一、数据类型转换

1.理解数据类型转换

Java作为一个强类型编程语言,当不同数据类型之间的变量相互赋值时,会有较严格的校验。

1.1基本数据类型之间的转换

1.1.1.int和boolean类型相互赋值

对C语言有所了解的老铁都知道,我们可以用0、1表示真假,即Java中boolean类型的true和false,1,0是int类型的,那boolean类型可不可以和int类型相互赋值呢?

int a=10;
        boolean b=true;
        b=a;//编译出错,提示不兼容类型
        a=b;//编译出错,提示不兼容类型

很显然,int类型和noolean之间不能相互赋值。
其实在Java中,boolean类型不能和其它任何类型相互赋值。

1.1.2.int和long/double相互赋值
int a=10;
        long b=20;
        a=b;//编译失败,可能会损失精度
        b=a;//编译通过

在这段代码中,存在int类型的值赋值给long,将long类型的值赋值给int。可以看到在将int类型的值赋值给long类型的时候编译不会报错,而在将long类型的值赋值给int类型时,编译不会通过,会报错。
这是因为long类型的范围比int类型的范围更大,就相当于在生活中把一杯大杯的奶茶倒进小的水杯里,就有可能装不下,奶茶溢出。同样的大范围变量赋值给小变量就可能造成数据溢出,这样程序在编译过程中就不会通过。
double类型比int、long类型的范围都大,同样的

int a=10;
        long b=20;
        double c=30;
        c=b;
        System.out.println(c);//打印 20.0
        c=a;
        System.out.println(c);//打印 10.0
        a=c;//编译出错;
        b=c;//编译出错;
1.1.3.int字面值常量给byte赋值

在上面我们知道,大范围的类型是不能直接赋值给小范围的,但是

byte a=100;//编译通过;
        byte a2=128;//编译出错;

我们知道,100和128是int类型字面量,就相当于将int类型赋值给byte,这里却编译通过了,这是为什么呢?
我们知道,byte表示的范围是-128->127,100在范围之内,而128已经超出范围了,所以100通过了,而128出错。(定义变量是方便会面进行一系列的运算,而在运算过程中,cpu时按照4个字节从内存中读写数据,所以像byte/short这种都会先提升成int类型,在参与运算,所以用int字面量,只要在其范围之类都可以。)
结论

使用字面量赋值时,Java会自动进行一些校验检查,判定赋值是否合理。

1.1.4.int与char
char b1='a';
        int a1=b1;
        System.out.println(a1);//97

Java中使用unicode码,因此将char转换成int输出的是char字符unicode中对应的序号。

在运算过程中,经常需要用到double转int等,怎么办呢?
这就需要用到强制类型转换。

1.1.4.强制类型转换
int a=1;
        double b=10.5;
        a=(int)b;//将b强制转换成int类型,赋值给a;
        System.out.println(a);//输出10;

这里将double类型强制转换成了int类型,但是我们会发现,强制转换之后,a的值并不是b的值,只是取了b的整数部分。
那boolean能不能进行强制转换呢?

int a=1;
        boolean b=false;
        a=(int)b;//编译不通过,提示java: 不兼容的类型: boolean无法转换为int
        b=(boolean) a;//编译不通过,提示java: 不兼容的类型: int无法转换为boolean;

int与char之间的强制转换

int a=97;
        char b=(char)a;
        System.out.println(b);//a;

Java中使用unicode码,因此将int强制转换成char输出的是int数值在unicode中对应的字符。
结论

1.强制类型转换可能会导致精度损失
2.强制类型转换不是一定能成功,互不相关的类型之间无法进行强制类型转换。

1.2.基本类型和引用类型之间的相互转换

例如:

int与String之间的转换

int类型转换成String类型
方法一:字符串的拼接

int a=1999;
        String b=a+"";
        System.out.println(b);//输出字符串 1999

方法二:

int a=1999;
        String b=String.valueOf(a);
        System.out.println(b);//输出字符串 1999

String类型转换成int类型

String str = "123";//当字符串中包含非数字时转换会出错;
        int b=Integer.parseInt(str);
        int a = Integer.valueOf(str);
        System.out.println(a);
        System.out.println(b);

二、数据类型提升

1.int和long混合运算

int a=120;
        long b=121;
        long c=a+b;
        System.out.println(c);//241
        int d=a+b;//java: 不兼容的类型: 从long转换到int可能会有损失

结论
当int与long混合运算时,int提升成long,得到的结果是long类型的,需要用long类型的变量去接收结果,如果需要用int去接收结果,就需要用到强制类型转换。

2.byte与byte的运算

byte a=10;
        byte b=20;
        byte c=a+b;//java: 不兼容的类型: 从int转换到byte可能会有损失
        System.out.println(c);

这里前面我们说过,byte/short一类,在运算过程中会自动提升成int类型,因此a+b的结果是int类型,而int类型与byte之间需要利用强制类型转换。

总结

1.不同类型的数据混合运算时,范围小的会提升成范围大的。
2.对于short,byte这种比4个字节小的类型,会先提升成4个字节的int,再运算。