自动转换
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;//正确 }
}
上面的例子也就是所谓的二个默认 当二个整数变量相加时 默认是int类型相加 当二个浮点型类型相加时 默认是doblue类型相加
在看一个例子
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);
}
}
那第二种为什么是可行的呢?
因为+=、-+、*=、/= 这些运算符比较特殊 本身就具有强制类型转换的作用。