一.先说一下什么是值传递
值传递指的是把实参的值(这个值可能是基本类型的数值也可能是引用类型的引用地址)copy一份传递给形参 方法对copy的值(形参)的任何修改都不会对实参本身产生任何影响
二.为什么修改引用类型的时候 也会对实参引用的对象有影响呢?
常见的就是传递一个引用类型 结果引用本身被修改了
如果实参是对象的引用 那么copy的就是该引用指向的地址值 因为实参和copy出来赋值给形参的这一份引用指向同一份内存地址 也即指向堆中同一个对象 所以如果在方法中修改了该对象的属性 那么原对象属性自然也会发生改变 因为这就是同一个对象
三.如何证明Java中没有所谓的引用传递呢?
想证明不是引用传递 只需要将在方法中 将copy的这一份引用指向新的对象 即可发现 对新对象不管做任何修改 都不会作用到原对象 这就表明 没有修改到实参引用所指向的地址 而仅仅是修改了copy的这一份引用所指向的内存地址
说起来可能有点点绕,用代码看看吧:
public class User {
private String name;
private Integer age;
public static void main(String[] args) {
User user = new User();
user.setName("张三");
user.setAge(18);
System.out.println("实参的user = " + user);
modify(user);
System.out.println("实参的user = " + user);
}
public static void modify(User user){
user = new User();
user.setName("李四");
user.setAge(20);
System.out.println("形参的user = " + user);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
输出结果:
输出结果:可以发现原对象的属性并没有发生修改,这就证明原对象的引用所指向的地址没有发生变化 这就证明了即便参数是引用类型 也是值传递,你无法修改原本那一份引用所指向的地址