- 自动类型转换(隐式类型转换)
- 强制类型转换(显式类型转换)
- 自动提升数据类型
- 自动的强制类型转换
取值范围小的数据类型的数据赋值给取值范围大的数据类型变量,会自动完成数据类型转换
例如: short num1 = 10; int num2 = num1;//num1是short类型,会隐式类型转换成int类型,编译器在干这事
强制类型转换(显式类型转换)取值范围大的数据类型的数据赋值给取值范围小的数据类型变量,通常情况下不会自动完成数据类型转换,需要强制类型转换
例如: int num1 = 10; byte num2 = (byte)num1;
自动提升数据类型byte/short/char这三种类型在运算时都会先提升为int类型然后再计算。
举例子:
byte num1 = 40;
byte num2 = 60;
byte num3 = num1 + num2; // 编译报错,因为右边的数据类型是int,取值范围大于byte类型,所以不能直接赋值,即不可以自动类型转换,必须强制类型转换
// 正确的写法
byte num3 = (byte)(num1 + num2);
num1和num2的值会先转换成int类型的,那么相加后自然也是int类型的。
byte + byte → int + int → int
自动的强制类型转换问题一: byte num = 100编译会通过呢? 100默认是int类型的呀! 答:隐藏了强制类型转换,int → byte,编译器在干这事,class文件会自动补上(byte)
问题二: byte num = 30; num += 5;// 即num = num +5 ,右侧是byte + int,自动变成int + int,最后结果是int ,左侧num是byte,int赋值给byte,也是隐藏了强制类型转换,编译器在干这事
问题三: char zhifu = 65;// int → char,65没有超出char范围,隐藏了强制类型转换 System.out.println(zhifu);// 结果是字符A
问题四:
short a = 5; short b = 8;
short c = a + b;// 编译报错,short + short → int + int = int,右侧是int,且含有变量,所以编译器不会隐式的强转,因为变量的值对于编译器而言是未知的,可大可小,所以必须显式强制类型转换
short d = 5 + 8;// 编译通过,虽然右侧也是int,但是都是常量(称为字面量好点),没有变量参与,数值固定不变,编译时会将常量(字面量)表达式直接计算得到结果13(class文件,short d = 13;),且13又没有超过short的范围,所以编译器自动强转,这叫编译器的“常量(字面量)优化”
注意:对于byte/short/char三种类型而言,如果右侧的数值没有超过类型取值范围,那么编译器会自动隐含地补上(byte)(short)(char)。如果右侧的数值超过左侧类型的取值范围,编译直接报错,当然你可以强制类型转换,数值会溢出