类型转换
因为java是强类型语言,因此进行运算时,需要用到类型转换。
运算中,不同类型的数据先转换为同一类型,并且转换成其中优先级最高或最大的类型,再进行运算。
(优先级)低-------->高
byte,short,char,int,long,float,double
小数优先级大于整数
(char本质也是数值)
分类:
-
强制类型转换:(类型)变量名;当我们需要将优先级大的转换成优先级小的时候使用强制转换。
例如:
int a = 128; byte b = (byte)a;
其中 (byte)a就是强制转换将int类型a转换成优先级比int小的byte类型。
-
自动类型转换:优先级小的转换成优先级大的会自动转换,不用强制转换。
例如:
int a =128; double b = a;
就可以直接从int转换成double类型。
注意:转换时可能会有:
-
不能对布尔值转换。
-
不能把对象类型转换为不相干的类型。
-
转换时可能会出现内存溢出或精度丢失问题。
-
(内存溢出)例如:
int a = 128; byte b = (byte)a; //因为byte只能支持到127,超出byte范围造成内存溢出,因此输出b时不是128,而是其他值。
-
(精度丢失)例如:
System.out.println((int)23.7); //该代码输出23。丢失了精度。
-
-
在把高容量转换到低容量时,使用强制转换。
关于char类型转换拓展:
代码:
char c = 'a'; int d = c+1;
在char c = 'a';中我们把字符a储存到c中,但在int d = c+1;中会将字符a转换成数值,根据编码(Unicode)中可以知道a数值为97,所以d=98。当我们使用强制转换将d转换成char类型后,输出的是b。
常见问题
小知识点:JDK7的新特性,数字之间可以用_分割,而且不影响运算,例如:
int a = 1000000000; //可以写成 int a = 10_0000_0000;
-
当我们操作比较大的数时,要注意溢出问题。
代码:
int a = 1000000000; int b = 20; int c = a*b;
但是当我们输出c时,出现了错误的值,这是因为此时a*b的值已经超过了int的范围。
那么我们接下来修改 c的类型为long类型:
int a = 1000000000; int b = 20; long c = a*b;
可是,上面代码我们输出后依旧不是我们想要的数,那是因为a*b所产生的值依旧是int类型,但a * b的值超过了int的范围所以出现内存溢出,并把该内存溢出所产生的错误值转换成long类型。
要解决该问题,我们需要在a*b之前就转换成long类型,所以代码修改如下:
int a = 1000000000; int b = 20; long c = a*(long)b;
此时我们输出的c值才是正确的。