版权声明:欢迎转载,期待指正 https://blog.csdn.net/fighting_sxw/article/details/89737899
public class TestAB {
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+"");
}
public static void main(String[] args) {
new TestAB().test();
}
}
输出结果为:
-128
127
对应字节码文件如下:
public class TestAB {
public TestAB() {
}
public void add(Byte b) {
(byte)(b + 1);
}
public void test() {
Byte a = 127;
Byte b = 127;
this.add(a = (byte)(a + 1));
System.out.println(a + " ");
this.add(b);
System.out.println(b + "");
}
public static void main(String[] args) {
(new TestAB()).test();
}
}
分析:
关键点:Byte是引用类型,传递的是引用
首先 add方法中 b=b++ 是先赋值,再做加运算,所以b的值不变,因为加运算的结果没有被赋值
add方法的字节码如下:
public void add(Byte b) {
(byte)(b + 1);
}
可以看到 add方法中只进行了+1运行,但是并没有赋值运算
test方法中的++a语句 对应的字节码如下:
a = (byte)(a + 1) 可以看到 a+1 的值 重新赋给了a
但是Byte类型最大为127,+1后出现溢出,所以 a是-128
再调用add方法后,根据上面的分析 a的值不会变化,所以输出a的值为-128
b的值为127,因为add方法不会改变b的值
ps:从大佬的抖音直接搬运过来,抖音号:Todaystart,不妥之处,还望指正!