关于Java引用传递的一个困惑?
本文介绍了关于Java引用传递的一个困惑?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
public static void swapEqual(int[] a,int[] b){
int[] temp=new int[b.length];
temp=b;
b=a;
a=temp;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] c={1,2};
int[] d={3,4};
swapEqual(c,d);
System.out.println(c[1]);
}
为什么打印出来的C[1]还是原来的2啊,为什么没有交换。数组的=不就是复制引用吗?通过函数可以把a,b的引用交换,这样不就是把内容交换了吗?
干嘛非要这样写?
public static void swap(int[] a,int[] b){
int[] temp=new int[b.length];
for(int i=0;i<b.length;i++){
temp[i]=b[i];
}
for(int i=0;i<b.length;i++){
b[i]=a[i];
}
for(int i=0;i<b.length;i++){
a[i]=temp[i];
}
}
这样子我试了一下,就可以达到交换的目的了
好困惑啊,求解!!
解决方案
swapEqual(int[] a,int[] b)中:
一开始:
a --> {1,2}(地址1)
b --> {3,4}(地址2)
经过你的代码处理(a,b指向的地址交换了):
b --> {1,2}(地址1)
a --> {3,4}(地址2)
但是不会对c,d造成影响,c,d依旧是:
c --> {1,2}(地址1)
d --> {3,4}(地址2)
//=================================
swap(int[] a,int[] b)中:
一开始:
a --> {1,2}(地址1)
b --> {3,4}(地址2)
经过你的代码处理(地址1,2中的值交换了):
a --> {3,4}(地址1)
b --> {1,2}(地址2)
虽然不会对c,d指向的地址造成影响,但是原本地址下的值已经改变了:
c --> {3,4}(地址1)
d --> {1,2}(地址2)
//=======================================
我的理解是这样,写完发现与@lianera的表述是同一个意思,就当是补充说明了。
//=======================================
你可以尝试用return把swapEqual(int[] a,int[] b)中交换后的a,b的值赋给c,d,看看结果。
这篇关于关于Java引用传递的一个困惑?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文