困惑新人的问题:为什么说Java中只有值传递

131 阅读2分钟

一.先说一下什么是值传递

值传递指的是把实参的值(这个值可能是基本类型的数值也可能是引用类型的引用地址)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 +
                '}';
    }
}

输出结果:

输出结果:可以发现原对象的属性并没有发生修改,这就证明原对象的引用所指向的地址没有发生变化 这就证明了即便参数是引用类型 也是值传递,你无法修改原本那一份引用所指向的地址