作为java中的基础,类型转换不学好,以后的开发中可能会出现各式各样的bug,到那时你想改bug有可能都找不到!
强制转换符:(转换的数据类型[int,short,byte,long]) 字面量/字面值int y = (int)Number;// 强制转换成int类型
强制转换原理:
- 原始数据的二进制字节码:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 01100100
8字节long类型 - 强转后的数据:
00000000 00000000 00000000 01100100
4字节int类型
强转的的原理就是将数值左边的二进制砍掉
自动类型转换机制:
long x = 456;
小容量可以自动转换成大容量,‘456’ 被默认设为int类型,但是使用的是long类型声明变量进行赋值,所以会自动转换成long类型;
这种机制被称为:自动类型转换机制
关于基本数据类型之间的互相转化:转换规则:
1、八种数据当中除布尔类型不可转换,剩下的7种类型之间都可以进行转换
2、小容量向大容量转换,称为自动类型转换,容量从小到大排序:
- byte < short < int < long < float < double
char <
char和short可表示的种类数量相同,但是char可以取更大的正整数
3、大容量转换成小容量,叫做强制类型转换,需要加强制类型转换符,
程序才能编译通过,但是在运行阶段可能会损失精度,所以谨慎使用。
4、当整数字面值没有超出byte,short,char的取值范围,
可以直接赋值给byte,short,char类型的变量。
5、byte,short,char混合运算的时候,各自先转换成int类型再做运算。
6、多种数据类型混合运算,先转换成容量最大的类型再做运算。
样式例子:
1*
double dd = 10/3;
System.out.println(dd); // 输出3.0
- 逻辑分析:在最开始,整数型已经被当做是int类型进行除法,所以得3;
因为赋值的是double类型所以输出的结果是3.0;
程序先运行10/3=3;int类型相除取整数!然后赋值给dd变量
变量是double类型,所以结果是3.0 - 该例中先理清执行的顺序,先进行的是10/3的整数计算,得出了3,然后才是将这个3赋值给dd
2*
dd = 10.0 / 3;
System.out.println(dd); // 输出3.3333333333333335
- 逻辑分析:与上方例子不同右方赋值项的式子是 double类型 / int类型;
所以在一开始运算结果的时候就3.333333333333,最后将dd重新设置为该值 - 与上例一样先理清执行顺序,先进行运算。这里运算时double类型10.0 / int类型3得出结果是3.33333333333333333这个无限循环小数,然后才将这个小数赋值给dd变量
3*
long g = 10;
byte b = (byte)(int)g/3;
- 编译出错!逻辑分析:
先把g变量弄明白是什么类型了再与3这个int类型做运算公式
最开始的g是long类型强制转换后成为了int类型再次转换后成为了byte类型
long类型g > int类型g > byte类型g
转换后的运算: byte类型g(10) / int类型3 = int类型3
为什么报错?最后运算后的是int类型,而赋值的变量是byte类型,大容量转小容量,精度受损所以报错。 - 在该例中,第一句代码并无报错,第二句代码先行完成的是类型转换将g变量强制转换成了byte变量 ,byte类型g / int类型3 得出 int类型3,出错的点在于变量的接收。一个byte类型的b变量,要接收int类型的字面值?问题出在这里,大容量的int类型字面值存进byte类型b变量中,先进行转换,由于未加强制类型转换符,所以大容量转小容量-精度受损
解决方法1:
int b = (byte)(int)g/3;
System.out.println(b);//输出3
- 接收的变量是int类型,int类型字面值赋值给int类型变量,没毛病
解决方法2:
byte b = (byte)(int)(g/3);
System.out.println(b);//输出3
- 在计算的时候先计算g/3得出结果3,然后转换为int类型,转换成byte类型,最后将byte类型字面值赋值给byte类型变量b
类型转换总结:
* 牢记上方6条类型转换规则!
* 在脑海中将编译和运行两个阶段分开,这是两个不同的阶段!