java陷阱---奇怪的swap----java中的值传递

来源:互联网 时间:1970-01-01

java中的public static <T> void swap(T a ,T b){//这里a,b是副本,我们对副本操纵是没有意义的T t = a;a=b;b=t;}对这个方法测试表明,交换没有发生。。。。火了我。。。。为什么呢?java中只有副本传递。。。。给别人的永远是一个副本a--->a的值<----a'(其中a',b'分别为a,b在传递参数的时候产生的副本) b--->b的值<----b' 进入函数体后副本发生了交换,如下图示: a-->a的值<---b' b-->b的值<---a'所以a,b根本就没动过。。。。怎么解决呢。。?因为只有第一级会是副本。。。所以我们需要传递的东西应该位于2级比如用数组:public static <T> void swap(T[] a ){ //这里a是副本,但是a[0],a[1]就不是副本,所以我们交换的不是副本T t = a[0];a[0]=a[1];a[1]=t;}示意图: a' | ↓a--->a[]的地址--->a[0]的值 | | ↓ a[1]的值所以我们是用的a[]的副本,但是操纵的还是真实的东西,不是副本。。。所以用对象也是可以的。。。 Obj' | ↓obj----->a1--->a1的值 Obj' | ↓obj----->a2--->a2的值注意:String a ="aa";String b ="bb";String[] m = new String[]{a,b};swapStr(m);System.out.println(m[0]);System.out.println(a);System.out.println(m[1]);System.out.println(b);这里a,b被传到m中是值传递哈。。。。所以交换后ab的值没改变,但是m[0]和m[1]的值改变了


相关阅读:
Top