Java作为一种强类型语言,在进行一些运算时需要用到类型转换。在运算时,所有的不同数据类型都转换为同一种数据类型然后进行运算。
在Java中,基本数据类型转换分为强制类型转换和自动类型转换。
强制类型转换:数据类型由内存容量高的数据类型转换为内存容量低的数据类型。转换格式为:(数据类型)变量名。
自动转换:由系统自动的进行数据类型转换,与强制转换相反。由内存容量低的数据类型转换为内存容量高的数据类型。
int i=128; byte b=(byte)i;//强制转换 高容量转换为低容量 double a=i;//自动转换 低容量转换为高容量 System.out.println(i); System.out.println(b); System.out.println(a);
在以上代码中,我们将整型数据 i 强制转化为byte类型的数据然后赋值给 b。将 i 赋值给double类型的 a ,在这过程中由于int类型的内存容量比double类型低,满足自动转换的要求,在系统编译过程中自动的将 i 转化为double类型赋值给 a 。
运行结果:
从运行结果中我们看到 b 的值不是128而是-128,这又是为什么呢?
由于byte是一个字节内存,表示范围是-128~127,128超过了其表示的最大范围,出现了内存溢出的问题。
由以上例子我们看出类型转换会出现内存溢出的问题。接下来,我们来看一下类型转换出现的另一个问题:精度问题。
System.out.println((int)24.15);//精度问题 System.out.println((int)245.25F);
运行结果:
由运行结果我们看到浮点数转化为整型数据时会失去小数点后的数据,造成数据的精度问题。
我们在看一段代码
int money=10_0000_0000;//数字可以用下划线分割 int year=20; int total1=money*year; long total2=money*year; long total3=(long)money*year; System.out.println(total1);//溢出 System.out.println(total2); System.out.println(total3);
以上代码中,两个int类型的数据相乘得到的数赋值给三个变量,但是我们知道int类型占四个字节,而上面两个数相乘已经超过了int类型表示的最大范围。既然int类型的表示不了,我们可以用long类型的变量来表示它。但是,这样是否可行呢?我们知道money*year在运算时是两个int类型运算完成之后的返回值依然是一个int类型的数据此时它已经是溢出的状态,即使把这个数据自动转换赋值给double类型的变量,它依然还是溢出的值。要想解决这个问题,我们可以这样做,在运算之前将money强制转换为long类型,然后系统将year自动转换为long类型在进行运算得到返回值赋值给total3。这样,就避免了溢出情况。
运行结果:
小结:
1、不能对布尔型数据进行转换
2、不能把对象类型转换为不相干的类型
3、转换时可能会出现内存溢出和精度问题
4、强制转换:内存容量高的转换为低的
5、自动转换:内存容量低的转换为高的