为了账号安全,请及时绑定邮箱和手机立即绑定

java里我使用一个变量将数值暂存,但为何原变量改变后,暂存变量也跟着改变了呢?

java里我使用一个变量将数值暂存,但为何原变量改变后,暂存变量也跟着改变了呢?

绝地无双 2018-08-26 11:26:18
我写了一个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 的源码实现,是如何处理深拷贝的。


查看完整回答
反对 回复 2018-08-27
  • 1 回答
  • 0 关注
  • 1210 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号