java中对象参数传递是传引用的副本,即值传递;方法内可修改对象状态但不能改变原引用指向,基本类型同理传值副本。

Java 中传递对象参数时,实际上传递的是对象的引用(即内存地址)的副本,而不是对象本身或其完整拷贝。这意味着方法内部可以修改对象的状态(比如改变成员变量的值),但无法让原引用指向新对象。
对象参数传递的本质是“传引用的副本”
Java 只有值传递(pass by value),没有真正的引用传递。当把一个对象传给方法时,JVM 会复制该引用的值(也就是对象在堆中的地址),然后把这个副本传入方法。因此:
- 方法内通过这个副本引用可以访问并修改原对象的属性(如 obj.name = "new");
- 但如果在方法内让形参指向新对象(如 obj = new Person()),不会影响调用方的原始引用;
- 基本类型(int、boolean 等)传的是值的副本,修改不影响原变量。
常见误区:以为“传对象”就是传整个对象
很多人误以为“传对象”会复制整个对象内容,其实不会。例如:
Person p = new Person("Alice");
changeName(p);
System.out.println(p.getName()); // 输出 "Bob"
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
如果 changeName 方法里写了 person.setName("Bob"),名字会被改掉——因为操作的是同一个堆对象;但若写成 person = new Person("Charlie"),则对原 p 没有任何影响。
如何真正实现“传对象副本”(深拷贝)
如果业务需要避免方法内修改影响原对象,就得手动做拷贝:
- 实现 Cloneable 接口并重写 clone()(注意浅拷贝问题);
- 使用构造函数传参创建新对象(如 new Person(old.getName()));
- 用序列化/反序列化实现深拷贝(适合复杂对象);
- 借助工具类如 Apache Commons Lang 的 BeanUtils.cloneBean()。
小结:关键看操作的是“引用所指的对象”,还是“引用本身”
只要记住一点:Java 所有参数都是值传递。对象参数的“值”是引用地址。所以能改对象内容,改不了引用指向。理解这点,就能准确预判方法调用后的行为。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










