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

我写了一个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 abcd
end cabd

我想问的问题是,为何我进入function之前,已经用tempchs将输入的abcd暂存,但当它将abcd成功变为cabd时,我的tempchs却改变了呢?

改变的结果,不是应该只改变了chs本身吗?


绝地无双
浏览 1211回答 1
1回答

鸿蒙传说

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 的源码实现,是如何处理深拷贝的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java