变量之间的类型转换主要包括自动类型转换和强制类型转换。
1、自动类型转换:当容量小的数据类型与容量大的数据类型做运算时,容量小的会自动的转换成容量大的类型。
【知识点】:
a)char,byte,short ---> int ---> long ---> float ---> double ---> String
- char c = 'a';
- short s = 12;
- byte b = 125;
- //char、short和byte之间运算全部自动转换成int
- int s1 = c + s;
- int s2 = b + s;
- int s3 = c + b;
- long l = 1000L;
- //int和long之间的运算自动转换成long
- long l1 = s1 + l;
- float f = 12.36f;
- //long和float之间的运算自动转换成float
- float f1 = l1 + f;
- double d = 16952;
- //float和double之间的运算自动转换成double
- double d1 = f1 + d;
b)那是不是有人反思过这样的问题。
short a = 3; // 编译正常
a = a + 3;// 编译错误
a += 3; // 编译正确(原因参照强制类型转换)
3 也是默认类型 int 类型,为什么直接赋值给 a 没事,而 a+3 自动转换成也是 int 类型的,再赋值就编译错误了呢?
问题关键点在 3 是常量,这种赋值操作只有后面是变量的情况下才会发生编译错误。所以我们的标题叫做变量之间的类型转换。
- int a = 1;
- int b = 2;
- byte b1 = 1 + 2;//编译正确
- byte b2 = a + b;//编译错误(cannot convert from int to byte)
那么常量运算也总结一下:
- byte b1 = 1 + 126; //编译正确
- byte b2 = 1 + 127; //编译错误(cannot convert from int to byte)
- int a = 1 + 1.2; //编译错误(cannot convert from double to int)
- String s2 = 12 + ""; //编译正确
(1)127 在 byte 的范围中,编译正常,而 128 超过了 byte 的范围,编译错误。
(2)1 + 1.2 = 2.2,2.2 是 double 类型,超过了 int 的范围,编译错误。
(3)12 + "" ="12"(int + String = String),谁和 String 做运算都被自动转换成 String。
总结:做常量运算,看结果的数值范围。不能单纯的看类型范围。
c)笔试题:
- String a = "abc";
- char c = 'a';//a的ASCII码是97
- int i = 12;
- System.out.println(a+c+i);//abca12
- System.out.println(c+i+a);//109abc
- System.out.println(a+i+c);//abc12a
2、强制类型转换:当容量大转换成容量小的,需要使用强制类型转换。用形式:(类型) 来做强制转换。
【知识点】:
a)强制类型转换的问题:导致精度的丢失
- int i = 128;
- byte by = (byte)i;
- System.out.println(by);
输出结果:-128
b)+=,-=,*= 这类的运算符运算是自动被强制类型转换的。
例如上面的案例: a += 3; 其实等价于 short a = (short)a+3; 所以肯定不会编译错误。
来源: http://www.bubuko.com/infodetail-1978834.html