自动转换
- class Hello
- {public static void main(String[] args)
- {
- // 自动转换
- int a = 5;
- byte b = 6;
- int c = a + b;
- System.out.println(c);
- }
- }
a 是 int 类型, b 是 byte 类型 当二者进行加法运算时(根据同类型相加结果还是同类型) 由于 int 的范围比 byte 的取值范围大这个时候 jvm 会自动将 b 转换成 int 类型
强制转换
- // 强制转换
- int a = (int)8.8;
强制转换就是将前面加上要转换的类型就可以了
下面来看比较特殊的
- class Hello
- {
- public static void main(String[] args)
- {
- byte b = 3;// 正确
- int x = 3;// 正确
- b = x;// 错误
- }
- }
上面代码在编译的时候会报错 常量 3 的类型为 int int 类型可以赋值给 byte 的变量 但是 b=x 这个时候就不行了呢 因为根据常量优化机制 这种方式只针对 常量 不针对变量 也就是说大范围的不能赋值给小范围 除非用强制转换类型
在看下面的也遵循上面的原则
- class Hello
- {
- public static void main(String[] args)
- {
- byte b1=3,b2=4,b;// 正确
- b = b1 + b2;// 错误 因为 b1 b2 这个时候是变量(常量优化机制只针对常量不针对变量)
- b = 3 + 4;// 正确
- }
- }
在看一个例子
- class Hello
- {
- public static void main(String[] args)
- {
- short s = 1;
- s = s + 1;// 错误
和
- short s = 1;
- s+=1;// 正确
- }
- }
上面的代码从表面上看是没什么区别的 为什么第二种写法就正确了呢?
第一种算的时候 会将 s 自动转换为 int 类型在进行加法运算 (低精度转高精度) 然后得出的结果是 int 类型 在赋值给 short 类型 这样是不合适的(高精度不能赋值给低精度类型) 所以会报错 正确的写法如下面代码
- class Hello
- {
- public static void main(String[] args)
- {
- short s = 1;
- s = (short)(s + 1);
- System.out.println(s);
- }
- }
那第二种为什么是可行的呢?
因为 +=-+*=/= 这些运算符比较特殊 本身就具有强制类型转换的作用
来源: http://www.bubuko.com/infodetail-2520790.html