对于这个问题,任何人都会告诉你是值传递,但解释的大都模糊,这篇文章带你解决这个疑问。
值传递和引用传递的概念
值传递(pass by value):在调用方法时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数。
引用传递(pass by reference):在调用方法时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数;
很显然,在方法里修改对象的内容不会影响到原对象的就是值传递,那我们写一段Java代码验证一下。
这里定义一个进行调试的Java类
@Data
public class User {
private String name;
private Integer age;
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
}
测试类代码
public class Test {
public static void main(String[] args) {
User user = new User("李四",19);
System.out.println("调用方法前---------->" + user);
updateJavaBean(user);
System.out.println("调用方法后---------->" + user);
}
public static void updateJavaBean(User user){
user.setName("张三");
user.setAge(18);
}
}
执行结果
调用方法前---------->User(name=李四, age=19)
调用方法后---------->User(name=张三, age=18)
可以看到,对象被传递到updateJavaBean方法后,在方法内修改了其内容,最终在main方法的值也改变了。
基于这样一个例子,很多人说,这和引用传递的现象是一样的,就是在方法内改变参数的值会影响到原参数。
大家不要被这种现象蒙蔽,这其实是Java将对象的地址作为参数,复制了一份传给了方法。他可以修改对象里的内容,但修改不了这个引用地址。
举个例子: 你朋友要去你家,你把唯一的钥匙直接给了他,这是引用传递,如果他在钥匙上做了个记号,那么你拿回来依然存在。
如果你把钥匙复制了一份交给他,无论他怎么折腾那把钥匙,你的这把钥匙不会受到影响,如果朋友进你家把电视机砸了,那对于你来说也是可见的,但唯一不变的是你手里这把钥匙,Java的值传递就是这种思想。
那咱们改写一下代码,让参数值直接赋给一个新的引用会不会受到影响
public class Test {
public static void main(String[] args) {
User user = new User("李四",19);
System.out.println("调用方法前---------->" + user);
updateJavaBean(user);
System.out.println("调用方法后---------->" + user);
}
public static void updateJavaBean(User user){
user = new User("张三",18);
}
}
执行结果:
调用方法前---------->User(name=李四, age=19)
调用方法后---------->User(name=李四, age=19)
很显然没有影响。
总结:Java对象的传递,如果修改引用,则不会对原来对象有影响,如果直接修改共享对象属性的值,则会影响。
Java中只有值传递,只不过传递的内容是这个对象的引用,通过这个地址找到属性内容,如果是引用传递的话,修改引用同样会影响前对象。