java自动类型转换

2017-01-01 10:46

java转型范围,自动转型和强制转型。

自动类型转换

  • 也称隐式类型转换,是指不需要书写代码,由系统自动完成的类型转换。由于实际开发中这样的类型转换很多,所以 Java 语言在设计时,没有为该操作设计语法,而是由 JVM 自动完成。
  • 转换规则:从存储范围小的类型到存储范围大的类型。
    具体规则为:byte→short(char)→int→long→float→double
    注意问题:在整数之间进行类型转换时,数值不发生改变,而将整数类型,特别是比较大的整数类型转换成小数类型时,由于存储方式不同,有可能存在数据精度的损失。

  • 窄化和宽化转换

基本类型转型(除boolean,这个不能接受任何转型动作) 只要是宽化转换,就不需要明确指示。因为新型别能容纳来自是旧型别的信息,而不会遗失任何信息。只要有窄化转换时,编译器才会要求你强制转型。

short s = 2;
不会丢失精度,所以不提示失败,如果
short s = 222222;
就会提示失败,需要你进行强制转型

1、float f=3.4;是否正确? 
答:不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.4; 或者写成float f =3.4F .

注:由上面想到: byte、short 、 int 、 long 在初始化的时候给予整数,如long l = 3; byte b = 3; 虽然3默认是int类型的,但是这样是正确的。 这里需要在双精度数字后面加字母的只有float这一例了

2、short s1 = 1; s1 = s1 +1;有错吗?short s1 = 1; s1 += 1;有错吗? 
答:short s1 = 1; s1 = s1 + 1是错的,s1 + 1在运算过程中1是int类型,s1是short类型,向高的转,结果为int类型,所以这里需要强转,而 s1 += 1是正确的,因为jvm自动帮我们处理好了

注:short s1 = 1 + 2 + 3;是正确的。当然除了short 比short低的byte也有同样的问题

强制类型转换

  • 也称显式类型转换,是指必须书写代码才能完成的类型转换。该类类型转换很可能存在精度的损失,所以必须书写相应的代码,并且能够忍受该种损失时才进行该类型的转换。 转换规则:从存储范围大的类型到存储范围小的类型。 具体规则为:double→float→long→int→short(char)→byte 语法格式为:(转换到的类型)需要转换的值

http://blog.csdn.net/sgls652709/article/details/49061009