参考文章:https://blog.csdn.net/w372426096/article/details/82216742
Java中没有引用传递?
Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的
值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。
我发现我一直的误区是Java中用传递List集合或者传递对象就是引用传递 , 我理解的引用传递就是实参的值会跟随形参的改变而改变。
但是我忘了最重要的一点 , 引用传递和值传递的本质区别是实参传递给形参的时候会不会进行拷贝一份副本给形参。
在Java中我们传递一个基本数据类型很明显不会有任何问题 , 无疑就是值传递
歧义在于传递一个对象的问题到底是值传递还是引用传递。
Java没有引用传递?那就有人提出疑问了 , 我之前给方法传递一个对象或者传递一个List集合 , 调用list的add方法或者调用对象的set方法改变了形参的这个对象的值 , 发现实参的值也被改变了,这不是引用传递嘛
但是我们再看一个例子 , 又发现实参没有被改变呀
我们给在方法体中给person对象赋值发现实参并没有跟着改变
在这里就有些人在说 ,在Java中传递基本数据类型是值传递 , 传递对象类型是引用传递 , 可这正确吗?如果传递对象是引用传递 , 那给形参进行赋值为什么实参没被改变呢?
这到底是什么原理呢?
之前我也始终有一个误区 , 就是我给方法传入一个list对象 , 然后在方法体中调用list.add()方法,实参也跟着改变了 , 我一直认为他是引用传递。
有以上的误区其实都是我们对值传递和引用传递的不理解
引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
那么我们的Java传递一个对象给函数 , 既然是值传递为什么形参改变会导致实参的内容也发生改变呢?
这里我们是将对象的引用copy了一份 , 然后传递给形参 , 依然是值传递 , 传递的是引用这个值 , 但是形参和实参这两个引用都是指向同一个对象的 , 因此我们调用对象的set方法会导致对象内部的值改变 , 但是我们给形参直接赋一个值就相当于让形参这个引用指向了另外的对象 , 所以也就不会改变实参了
本质就是引用传递是不会copy副本的
而值传递是会拷贝一个副本给形参。