Java是强类型语言,要进行有些运算的时候,需要用到类型转换。
运算中,不同类型的数据先转化为同一类型,然后进行运算。
上一节说到的数值型数据类型,都可以进行运算。
我们按转换优先级由低到高排列如下:
byte , short , char --> int --> long --> float --> double
(注:char本质也是数字,也能进行运算。)
可见数据类型的容量越大,优先级越高,且小数的优先级高于整数(虽long容量大,但float比long高)。
类型转换分两种:强制类型转换和自动类型转换。
转换方式 | 语法 | 说明 |
---|---|---|
强制类型转换 | (目的类型)变量名 | 从优先级高的数据类型转化为优先级低的数据类型。(高 ---> 低),有可能引发溢出。 |
自动类型转换 | 直接赋值,自动转换 | 从优先级低的数据类型转化为优先级高的数据类型。(低 ---> 高) |
演练1:输入并执行下面代码,尝试一下类型转换,以及了解一些类型转换的相关注意事项。
public static void main(String[] args) { //强制转换 int a = 127; byte b = (byte)a; //将int转变为byte,由高向低转换,需要强制转换。 //byte b2= a; //如果不使用强制转换,则会报错编译不了。 System.out.println(b); System.out.println("================"); //强制转换可能存在溢出的情况 a = 128; b=(byte)a; // a值为128,而byte类型的最大值为127,使用强制转换后会引发内存溢出问题,输出不符合预期的值。 System.out.println(b); System.out.println("================"); //强制转换可能存在精度损失问题 System.out.println((int)23.23); System.out.println((int)-24.12F); System.out.println("================"); //自动类型转换c double c = a; //将int转变为double,由低向高转换,自动转换。 System.out.println(c); System.out.println("================"); //char本质也是数字,可以进行运算 char d='a'; int i=d+1; //char向int转换,由低向高,自动转换 System.out.println(i); //输出字母a代表的数字+1后的计算结果 System.out.println((char)i); //强制转换(由高向低),输出字母a+1运算后的字符 }
演练2:输入并执行下面代码,操作大数运算时,要注意溢出问题。
public static void main(String[] args) { int money = 10_0000_0000; //JDK7新特性,数字之间可以用下划线分隔 int year= 20; int total =money * year; //计算结果溢出,故得不到预期数值。 long total2 = money* year; //虽然将结果转化为long,但是转换之前数值已经存在问题,故也得不到预期数值。 long total3 = money * (long)year; //将其中一个运算的数值转换成long,能输出正确结果。 System.out.println(total); System.out.println(total2); System.out.println(total3); }
类型转换的注意点:
不能对布尔值进行转换。
不能把对象类型转换成不相干的类型。
在把高容量类型转换到低容量类型时,要强制转换。
转换时可能存在内存溢出问题或精度损失问题。