Byte加Byte不等于Byte

对于这段代码,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类型
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值