Java中仅存在值传而不是引用传递
结论:Java中仅存在值传递而不存在引用传递
这是一个十分容易犯错的地方,甚至很多时候老师也没有注意到这个问题。
首先给出一个例子来证明这个问题
class Solution {public void swap(char []a){
char []temp =new char[]{'1','2','3'};
a = temp;
System.out.println("test:" + a);
}
public static void main(String[] args) {
char []test =new char[]{'4','5','6'};
System.out.println("test:" + test);
Solution solution =new Solution();
solution.swap(test);
System.out.println(Arrays.toString(test));
}
}
这段代码的操作是,更换原字符数组的指向。原数组指向['4','5','6'],如果Java中是引用传递的话,使用swap()函数可以改变外部指针的指向,进而将test 指向的数组改为['1','2','3']。实验结果如下:
![](https://img.haomeiwen.com/i9003062/b4253732783fd968.png)
我们不难test的指向仍为['4','5','6']这从侧面反应了java中不是引用传递了,说明Java中是值传递。但根据我们的经验,我们可以通过函数修改数组中的值,那这又是怎么一回事呢?
不妨用下图来进行解释:
![](https://img.haomeiwen.com/i9003062/6c70ebadb067d135.png)
我们是将指向数组的值进行复制,当你更改复制后的的指向是不能改变原来指向的。
同理,我们用复制后的指向仍然是可以修改数组中的值。
总结
我们可以通过钥匙开门的例子来进行对比,引用就是直接把开门的钥匙递给你,而值传则是将钥匙进行了复制。
当然这两把钥匙都给打开同一个门,也能对门中的元素进行操作。但终究他们不是一把钥匙。