java自动拆包/装包易错点(AutoBoxing)

来源:互联网 发布:js获取input的name值 编辑:程序博客网 时间:2024/05/22 17:26

在牛客上遇见一道java :

public class Test {    public void add(Byte b)    {        b=b++;    }    public void test()    {        Byte a=127;        Byte b=127;        add(++a);        System.out.println(a+"");        add(b);        System.out.println(b);    }
 ,原题判断输出情况:

byte范围:-128~127;


执行++a时候,a会上溢变为-128,

传入add()函数时候,引用,原本会改变其值,在执行b=b++;时候。为基本值,退出函数时不会改变Byte型的值。

nailperry上传的反编译字节码:

// 源代码 public static void main(String[] args) { Byte a = 127; ++a; } // 字节码 public static void main(java.lang.String[]); Code: 0: bipush 127 // 将一个byte型常量值推送至操作数栈栈顶 2: invokestatic #2 // 自动装箱:访问栈顶元素,作为函数实参传入静态方法Byte.valueOf(byte), // 返回value值为127的Byte对象的地址,并压栈 5: astore_1 // 将栈顶数值赋值给局部变量表中下标为1的引用型局部变量a,栈顶数值出栈。此时a对应的byte值为127。 6: aload_1 // 局部变量表中下标为1的引用型局部变量a进栈 7: invokevirtual #3 // 自动拆箱,访问栈顶元素a,调用实例方法a.byteValue获取a所指Byte // 对象的value值,并压栈 10: iconst_1 // int型常量值1进栈 11: iadd // 依次弹出栈顶两int型数值1(0000 0001)、127(0111 1111) //(byte类型自动转型为int类型)相加,并将结果128(1000 0000)进栈 12: i2b // 栈顶int值128(1000 0000)出栈,强转成byte值-128(1000 0000),并且结果进栈 13: invokestatic #2 // 自动装箱:访问栈顶元素,作为函数实参传入静态方法Byte.valueOf(byte), // 返回value值为-128的Byte对象的地址,并压栈 16: astore_1 // 将栈顶数值赋值给局部变量表中下标为1的引用型局部变量a,栈顶数值出栈。此时a对应的byte值为-128。 17: return }


0 0