int a ;
float b;两种情况:
1,a+=b:
//j 按如下方法解析:
a = (int)((float)a + b);
2,a = a+b;
//按照如下方法解析
a = (float)a+b;
所以 a= a+b会报错 而a+=b不会。
-----------------------------其他:
Java编译器会在编译期或者运行期将byte和short类型的数据带符号扩展为相应的int类型数据,
将boolean和char类型数据零位扩展为相应的int类型数据。
因此,在处理boolean 、byte、short 和 char 类型的数组是,也会用相应的int类型的字节码指令来处理。因此,大多数对于上述类型数据的操作,实际上都是使用相应的 int 类型作为运算类型。
如果是final 修饰的变量,进行运算的时候则不会出现类型转换异常。
public class Test {
final int d = 3;
public static void main(String[] args){
final short a = 1;
final short b =2;
short c=a+b;
}
}
编译后使用反编译软件打开后,代码被解析成了这样:
public class Test
{
final int d = 3;
public Test()
{
}
public static void main(String args[])
{
short a = 1;
short b = 2;
short c = 3;
}
}
可以看到,对于final 修饰的基本类型的变量来说,他们之间的运算直接就被硬编码成了直接赋值语句,连中间结果都没有了,类型转换的异常也就没了。
此外,我们可以注意到,对于方法内的final 变量 a , b 来说,编码时被直接省略了。而Test 类的final 成员变量 d 依然保留着final 属性。
所以说,是否使用final修饰方法中普通变量对JVM来说没有区别!使用final修饰方法中普通变量主要是为了给Java前端编译器(如javac)看的!也就是说方法中被final修饰的普通变量在前端编译时被javac检查并保证该变量不会在作用域内被改变新值,但被编译成字节码后用于修饰方法中普通变量的final就已经不存在了!说的再具体点就是你用或不用final修饰方法中普通变量而生成的字节码文件(.class文件)没有区别。