虽然这个问题从我入门那一天起就知道了,可是很不幸的,刚刚刷题又陷进去了。
以Java为例做说明:
关于Java参数引用的说明
Java中只有值传递,不管是原始类型还是引用类型,传递的都是副本。
①如果参数类型是原始类型,那么传过来的就是这个参数的一个副本,也就是这个原始参数的值。
②如果参数是对象名,即正文中所说的“对象引用”——Java中对象的变量名实际上代表的是对象在堆中的地址(专业术语叫对象引用),那么传来的就是这个引用参数的副本,这个副本存放的是参数的地址。如果函数中没有改变这个副本的地址,而是改变了地址中的值,那么这个改变会影响传入的参数。如果在函数中改变了副本的地址,那么副本就指别地儿去了,原来传入的参数不会受到影响。
另外需要注意,不可变类型如果是采用引用传递,那么连里面的值也改变不了,因为是不可变参数嘛。
其实概念是很简单的概念,但是当刷题写代码的时候,很容易就忘记了。
比如说,现在写一个带备忘录的递归程序。那么,有两种做法,
- 第一种就是在递归方法外创建一个变量;
- 第二种就是用引用传递参数去维护这个变量;
第一种无论是修改引用本身,还是引用内容都没有问题。
但是第二种如果设计了修改引用本身就会失败,这个时候又专注于算法的设计,很容易找不到问题所在,当然,如果你能够调试的话肯定能很快定位。