程子的博客

想得到从未得到的东西,就要去做从未做过的事

aaaaa
  menu
20 文章
0 评论
4014 浏览
0 当前访客
ღゝ◡╹)ノ❤️

一个对象被当做参数传递给一个方法,在这个方法改变这个对象的值,原对象也同时修改了,那么到底是值传递还是引用传递呢?

我们都知道 Java 编程语言只有值传递参数

但是当一个对象被当做参数传递给一个方法的时候,如果我们在这个方法中对对象进行改变的时候,我们发现原方法中的对象的值也同时产生了改变,那么问题来了, 这到底是值传递呢还是引用传递呢???
比如:

/**
 * 说明:
 *
 * @author :chengzi
 * Create :2019/7/8 16:53
 */
@Getter
@Setter
@ToString
@Accessors(chain = true)
public class User {
    
    private Integer id;
    
    private String name;
    
    private Integer age;
}

package cn.com.chengzime.question.domain.model;

/**
 * 说明:
 *
 * @author :chengzi
 * Create :2019/7/8 16:55
 */
public class Test {

    public static void main(String[] args) {
        User user = new User()
                .setId(1)
                .setName("刘能")
                .setAge(33);
        System.out.println("main 之前 : " + user.toString());
        new Test().update(user);
        System.out.println("main 之后 " + user.toString());
    }

    private void update(User user) {
        user.setName("赵四").setAge(32);
        System.out.println("update : " + user.toString());
    }


}

打印结果为:

main 之前 : User(id=1, name=刘能, age=33)
update : User(id=1, name=赵四, age=32)
main 之后 User(id=1, name=赵四, age=32)

答案是这个依然是值传递!

我们都知道在 java 中属性分为 基础数据类型 和 引用数据类型 两类:

基础数据类型:
当我们把基础数据类型的属性传递给一个方法的时候, 是传递了一个原属性的同值副本过去, 当我们在方法中对此副本进行修改的时候, 原属性不会受到影响.

引用数据类型:
当我们把引用数据类型的属性传递给一个方法的时候, 我们都知道, 引用数据类型存储的其实是对象的引用地址, 而不是整个对象, 所以, 传递的是一个原属性的同引用地址的一个副本, 当在方法中对此副本对象进行修改的时候, 其实修改的是此副本中引用地址所对应的对象, 原属性和副本引用的对象是同一个, 所以同时发生了改变.


标题:一个对象被当做参数传递给一个方法,在这个方法改变这个对象的值,原对象也同时修改了,那么到底是值传递还是引用传递呢?
作者:chengzime
地址:https://www.chengzime.com.cn/articles/2019/07/08/1562575854000.html

评论