1、自动类型转换
含义:
容量小的数据类型自动转换成容量大的数据类型
自动数据类型转换
//自动数据类型转换 public class Variable { public static void main(String[] args) { byte b = 8 ; short s = b; Sy(s); //控制台输出8 int i = s; Sy(i); //控制台输出8 long l = i; Sy(l); //控制台输出8 char name = '是'; int i1 = name; Sy(i1); //控制台输出26159 float f = 10f; double d = f; Sy(d); //控制台输出10.0 } }
注意:
- byte,short,int在做计算时,会转换成int类型;
public class Variable { public static void main(String[] args) { short s1 = 3; short s2 = s1 + 1; } }
以上代码在书写时编译工具会报错,公司的笔试中也总是能看到这个问题,乍一看,没什么问题,就是一个3+1的加法,但是byte,short,int在做计算时,会转换成int类型,也就是说,在s1+1时,实际上是int型的结果,这时如果用short类型去接收,就是大范围的数据类型转小范围的数据类型,编译器也会给出错误提示:Type mismatch: cannot convert from int to short,解决方法就是用一个int类型的变量接收或者强制转换。
- 如果把int转换成float类型,或者long转换成double,即图中虚线部分,不需要强制转换,但是可能会丢失精度
public class Variable { public static void main(String[] args) { int i = 345236236; float f = i; Sy(f); //控制台输出3.45236224E8 double d = i; Sy(d); //控制台输出3.45236236E8 long l = 9223720368545807L; double d1 = l; Sy(d1); //控制台输出9.223720368545808E15 } }
这和我们预期的输出结果不符合,之所以会出现精度丢失的问题,是因为byte,short,int,long,属于精确值,而float和double是属于近似值,精确值转近似值会出现精度丢失的问题,至于为什么会产生精度丢失,涉及到进制的转换,不深入剖析,在实际开发过程中避免即可。由于float和double是近似值,所以在做一些需要精确的数据比如货币、股票的操作时,不建议使用float或double,Java提供了专门处理这种数据的类。
2、强制类型转换
含义:
容量大的数据类型转换成容量小的数据类型需要添加强制类型转换;
小容量数据类型 变量名 = (小容量数据类型)(大容量数据类型的操作如加减乘除)
public class Variable { public static void main(String[] args) { short s1 = 3; short s2 = (short)(s1 + 1); //强制类型转换,int类型转换成short类型 Sy(s2); } }
在需要转换的数据前面指定该数据类型,就是强制类型转换,但是强制类型转换可能会造成精度的降低或数据溢出,boolean类型不能转换成其他任何数据类型。