public class Test2 { public void add(Byte b) { b = b++; } public void test() { Byte a = 127; Byte b = 127; add(++a); System.out.print(a + " "); add(b); System.out.print(b + ""); } }
// 源代码 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 }
public class Demo{ public static void main(String[] args) { Byte a = 127; Byte b=a; System.out.println("结果1:"+(a==b)); ++a; System.out.println("结果2:"+(a==b)); } }它的输出结果是:
结果1:true 结果2:false可以看到,值为-128和127时,指向的对象地址已经是不一样的了,类似于String类型。
public void add(Byte b){ b=b++; } 这里涉及java的自动装包/自动拆包(AutoBoxing/UnBoxing) Byte的首字母为大写,是类,看似是引用传递,但是在add函数内实现++操作,会自动拆包成byte值传递类型,所以add函数还是不能实现自增功能。也就是说add函数只是个摆设,没有任何作用。 Byte类型值大小为-128~127之间。 add(++a);这里++a会越界,a的值变为-128 add(b); 前面说了,add不起任何作用,b还是127