看下面这道题:
public class Test2
{
public void add(Byte b)
{
b = b++;
}
public void test()
{
Byte a = 127;
Byte b = 127;
add(++a); //-128
System.out.print(a + " ");
add(b); //127
System.out.print(b + "");
}
}
这题虽然涉及到很多(基本数据类型的装箱和拆箱、值传递和引用传递、……),但关键就是add方法到底起不起作用。
这题看似是传入Byte引用传递,但是在add方法中++,本质仍然是值传递,因此add方法没有起到自增的作用。
【小结】
除了上面的分析,这题还有其他需要注意的点:
-
自动装箱和拆箱
比如:Byte a =127; a = a++;
最终a是多少? a=127
而Byte b = 127; b = ++b;
最终b是多少? b=-128 -
传入包装类属于值传递
-
127+1=-128
(涉及计算机中的数运算、原码反码补码)
public class Main{
public static void add1(Byte b){
b = b++;
}
public static void add2(Byte b){
++b;
}
public static void main(String[] args){
Byte b1 = 127;
Byte b2 = 127;
Byte b3 = 127;
Byte b4= 127;
add1(b1);
add2(b2);
b3 = b3++;
++b4;
System.out.print1n(b1); //127
System.out.println(b2); //127
System.out.println(b3); //127
System.out.print1n(b4); //-128
}
}