Java方法返回引用类型时,返回的是堆中对象地址的副本,而非对象本身或深拷贝;调用方通过该地址可访问并修改原对象状态,但对象实体始终驻留在堆中不被复制。

Java中方法返回值时,返回的是对象引用的副本,不是对象本身,也不是对象的深拷贝。
返回的是堆中对象地址的副本
当方法声明返回一个类类型(如 Person、String、int[]),实际返回的是该对象在堆内存中的地址值的一个副本。调用方接收到的,是这个地址值的拷贝,和参数传递的机制完全一致——仍是“值传递”,只不过传的是地址值。
- 调用方拿到这个地址副本后,能通过它访问、修改原对象的状态(比如
obj.setName("Alice")) - 但若在方法内部
return new Person(),返回的是新对象的地址副本;若return obj,返回的是原对象地址的副本 - 不存在“返回整个对象实体”的操作——对象始终在堆中,方法只传递其位置信息
为什么说不是“返回对象本身”?
“对象本身”指堆中那块内存区域,它不会被复制或移动。方法无法把整块对象数据打包发出去。所谓“返回对象”,只是语义上的简写,底层永远是返回一个指向它的引用(即地址)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如
public List<String> getData() { return list; },返回的是list变量所存地址的副本 - 如果后续代码对返回的
List调用add(),会直接影响原始list的内容 - 但如果在方法里写
list = new ArrayList<>(); return list;,外部拿到的是新集合的地址,和原来的list无关
数组、集合、自定义对象都一样
所有引用类型(包括数组、StringBuffer、HashMap、你自己写的 Student 类)在作为返回值时,行为统一:
立即学习“Java免费学习笔记(深入)”;
- 返回的是引用地址的副本 → 外部可读写原对象状态
- 不自动克隆、不深拷贝、不序列化传输
- 若需隔离修改影响,必须显式创建副本,例如:
return new ArrayList(originalList);或使用clone()(注意浅拷贝限制)
和基本类型返回值对比更清楚
基本类型(int、boolean等)返回的是数值本身的副本;引用类型返回的是地址值的副本。二者都是值传递,差别只在于“值”的含义不同:
-
int getAge() { return age; }→ 返回栈中数值的拷贝 -
Person getPerson() { return p; }→ 返回栈中存储的地址的拷贝 - 它们都不可能让调用方直接修改方法内局部变量的存储位置

















