四. 强制类型转换

  • 因为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
  • 总结:
  1. 不能对布尔值进行转换
  2. 不能将对象转换为不相干的类型
  3. 把高容量转换到低容量需要进行强制转换
  4. 高容量到低容量进行强制转换时可能出现内存溢出或者精度问题。
  • 其他的一些问题
    看如下的一个程序:
//一个运算溢出的例子
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