Java中方法之间的参数专递有两种,分别是值传递和引用传递。两种有不同的含义。
- 值传递:指的是将当前对象的值copy到接下来的方法的新对象上,并不会更改被拷贝对象的值;
- 引用传递:实际上是对引用地址的内容的修改,这样会同时影响到引用这块地址的所有对象。
此处举一些日常中常用的错误参数传递的例子。
- 基础类型传递。
public static void main(String[] args) { Integer a = 10; updateValue(a); System.out.println("最终的a的值为:" + a); } /** * 修改a的值 * * @param b 待修改的值 */ private static void updateValue(Integer b) { System.out.println("修改之前的a的值:" + b); ++b; // 这里加个小插曲 b = (++b) + 1 和 b = (b++) + 1 最终b的值是否一样?还请大家思考一下 System.out.println("修改之后的a的值:" + b); }
这个是属于典型的值传递,可以看一下各自的内存地址。
由这两张图可以看出来一个问题,修改的方法中修改掉的变量和原变量不在一个内存地址中,所以并不能修改掉原来的对象。
- 对象类型传递。
public static void main(String[] args) { Person person = new Person(); person.setName("张三"); updateValue(person); System.out.println("最终的的值为:" + person.getName()); } /** * 修改a的值 * * @param person 待修改的值 */ private static void updateValue(Person person) { System.out.println("修改之前的的值:" + person.getName()); person.setName("李四"); System.out.println("修改之后的的值:" + person.getName()); }
输出的值为:
修改之前的的值:张三修改之后的的值:李四最终的的值为:李四
可以看到这个被更改了。这就属于典型的引用传递。