java中只有值传递,
基本类型:值直接保存在变量中
引用类型:变量中保存的是对象的地址
从第一次接触这个问题到现在,知乎两个回答已经看的好几遍了,但是没有真正的理解,所以才会重复的看很多遍,今天刷到剑指第36题的时候,又遇到了这个问题,所以要一次性把这个问题搞懂:
这个是第一次的写法:
这个是第二次的写法:
其实就想是想在递归的时候直接给参数赋值,但是第一种方法两个局部变量一直返回的是null,最后改成全局变量就是可以的,第一种方法时不行的,明显是值传递和引用传递没有搞清楚才产生的问题。
先说结论:
基本类型:大家都知道不会被改变
引用类型:
如果直接对形参有 = 的操作,那么是不会改变的,我们这的第一个方法就犯了这个错误,直接对head形参进行 = 操作。(如果是引用传递,这里是会直接改变的,所以在C中按第一种方法写是没有任何问题的)
如果对形参的变量有进一步操作,这样就是改变的。我们之前做链表的题,就是堆node.next = ,像这类操作。
所以现在我们再来看一下概念:
- 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
- 引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
注意是对参数的修改,和对参数的属性的修改是完全两个概念,引用hollis中回答的比喻:前者就是在复制的钥匙上打磨,做修改。而后者就相当于用复制的钥匙进到你的房间,对你的房间做修改!!!
以上,具体参考:
(6 封私信 / 28 条消息) Java 到底是值传递还是引用传递? - 知乎 (zhihu.com) 具体参考的hollis的回答。