我写了一个function,将比如abcd中c移动到指定位置,其余往后一个index举例: swap(abcd,2,0) 则输出 -> cabd代码如下public class why { static public void main(String args[]) { char[] chs = {'a','b','c','d'};
sw( chs ,2 , 0 );
}
static public void sw(char chs[] , int i , int j) {
char [] tempchs = chs ; //将abcd存入tempchs
System.out.print("start ");
System.out.println(tempchs);/*-----------------------------------------------------*/
char temp = chs[i];
for(int k = i ; k>j ; k--)
{
chs[k] = chs[k-1];
}
chs[j] = temp ;
/*-----------------------------------------------------*/
System.out.print("end ");
System.out.println(tempchs);
}}执行结果start abcdend cabd我想问的问题是,为何我进入function之前,已经用tempchs将输入的abcd暂存,但当它将abcd成功变为cabd时,我的tempchs却改变了呢?改变的结果,不是应该只改变了chs本身吗?
1 回答

鸿蒙传说
TA贡献1865条经验 获得超7个赞
java 默认 对象传递方式是 引用传递,
代码中 “ char [] tempchs = chs ; //将abcd存入tempchs ” 其实是将chs 和 tempchs 指向了同一个存放实际对象的内存区域。
所以实际内容改变了,通过引用 访问的结果也会跟着变。
关于这块内容 还有深拷贝和浅拷贝,但实际都是值传递和引用传递之间的区别,搞清楚这个点 有助于理解java如何操作变量,使用内存。
如果要达到你想要的效果,可以使用 java.util.Array 类
将 “ char [] tempchs = chs ; //将abcd存入tempchs ”
改为 “char [] tempchs = Arrays.copyOf(chs, chs.length) ; //将abcd存入tempchs” 即可
还可以参考 Arrays.copyOf 的源码实现,是如何处理深拷贝的。
添加回答
举报
0/150
提交
取消