Java到底是不是值传递

        对于这个问题,任何人都会告诉你是值传递,但解释的大都模糊,这篇文章带你解决这个疑问。

      值传递和引用传递的概念

       值传递(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中只有值传递,只不过传递的内容是这个对象的引用,通过这个地址找到属性内容,如果是引用传递的话,修改引用同样会影响前对象。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值