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']。实验结果如下:

我们不难test的指向仍为['4','5','6']这从侧面反应了java中不是引用传递了,说明Java中是值传递。但根据我们的经验,我们可以通过函数修改数组中的值,那这又是怎么一回事呢?

不妨用下图来进行解释:


我们是将指向数组的值进行复制,当你更改复制后的的指向是不能改变原来指向的。

同理,我们用复制后的指向仍然是可以修改数组中的值。

总结

我们可以通过钥匙开门的例子来进行对比,引用就是直接把开门的钥匙递给你,而值传则是将钥匙进行了复制。

当然这两把钥匙都给打开同一个门,也能对门中的元素进行操作。但终究他们不是一把钥匙。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。