Day03 Java的强制类型转换
四. 强制类型转换
-
因为Java是强类型语言,所以我们在进行一些计算的时候就会需要用到类型转换。
-
Java的类型转换分为一下两种
- 强制类型转换
- 自动类型转换
运算中,不同类型的数据先转化为同一类型,然后进行运算。Java在类型转换时遵循一下原则,从低等级转换到高等级为自动转换,反之则需要强制转换。Java的j基础数据类型从低到高排序如下
byte --> short,char --> int --> long --> float --> double
注:boolean 类型不参加强制转换
强制类型转换的语法为 (类型名)[需要转换的变量],例子如下
//自动类型转换 byte by = 1; int a = by; //正确 //强制类型转换 int i = 127; byte b = (byte)i;
从高类型转换到低类型的时候需要注意溢出问题和精度问题,如下例子:
//从高到低内存溢出的例子 int i = 128; byte by = (byte)i; //输出值为-128 //从高向低出现精度问题的例子 double d = 12.34; float f = -34.52F; int i1 = (int)d; //值为12 int i2 = (int)f; //值为-34
-
总结:
- 不能对布尔值进行转换
- 不能将对象转换为不相干的类型
- 把高容量转换到低容量需要进行强制转换
- 高容量到低容量进行强制转换时可能出现内存溢出或者精度问题。
-
其他的一些问题
看如下的一个程序:
//一个运算溢出的例子 int salary = 10_0000_0000;//JDK7支持使用下划线分割数字,更易阅读 int years = 20; int total1 = salary * years; //薪水的总和,显而易见的超过了int所能表示的范围 //他的输出是-1474836480 System.out.println(total1); long total2 = salary * years; //换用long储存,依旧输出同样的结果 System.out.println(total2);
产生这个结果的原因是是两个操作数的类型都是int,所以他们计算得出的结果为int,产生了溢出,而赋值号将等式右边的值赋给等式左边,由于表达式从左到右的运算规则,赋值给右方的值已经是错误的值,所以即使换用更大的类型储存,输出的值仍然是错误的结果。一种可行的修改方法如下:
long total3 = salary * (long)years; System.out.println(total3); //正确输出结果20000000000