对于这段代码,c=a+b那行爆红
public class Test {
public static void main(String[] args) {
Byte a = 1;
Byte b = 2;
Byte c = a + b;
System.out.println(c);
}
}
对于这段代码,可以正常运行并且结果也正确
public class Test {
public static void main(String[] args) {
Byte a = 1;
Byte b = 2;
Integer c = a + b;
System.out.println(c);
}
}
我们将Test.java使用javac编译为class文件,然后使用javap -v Test.class命令来分析字节码结构
第1和6行可以看到,当执行Byte a = 1和Byte b = 2时,Byte类型的a和b会先调用Byte.valueOf方法,源码如下,这个方法就是把byte自动装箱为Btye包装类
public static Byte valueOf(byte b) {
final int offset = 128;
return ByteCache.cache[(int)b + offset];
}
继续分析第11和15行,当执行Integer c = a + b时,会a和b会先调用调用Byte.byteValue方法,也就是a.byteValue()+b.byteValue,源码如下
public byte byteValue() {
return value;
}
在第18行中,有一个iadd得指令,为什么我们得byte类型相加会变成int或者integer类型呢,原因就在于这一行。在jvm中,只支持int类型的加法,而没有byte的加法指令,所以两个byte相加会自动扩展成两个int相加,然后在19行中,调用Integer.valueOf自动装箱为Integer类型