java参数是值传递,传入对象时传递的是引用副本;修改形参指向(如obj=new myobj())不影响外部引用,但修改对象内容(如obj.setname())对外可见。

不会改变。外部原对象仍然保持原来的引用,指向原来的堆内存地址。
为什么重新赋值不影响外部?
Java 所有参数都是值传递。传入对象时,实际传递的是该对象引用(即内存地址)的一个副本。方法内的形参和外部实参各自持有这个地址的拷贝,二者初始指向同一块堆内存。
当你执行 obj = new MyObj(); 时,只是把形参 obj 这个局部变量的值(也就是它存的那个地址)改成了新对象的地址。外部的原始变量所存的地址没动过,仍指向旧对象。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
关键区分:改“内容” vs 改“指向”
- ✅ 修改对象内容:如 obj.setName("Alice") 或 list.add(1) —— 操作的是堆中同一对象,外部可见
- ❌ 修改引用指向:如 obj = new MyObj() 或 str = "hello" —— 只改变形参变量本身,不波及外部
一个直观验证方式
在方法前后分别打印对象的哈希码:System.out.println(obj.hashCode());
- 如果哈希码不变,说明仍是同一个对象,内容修改生效
- 如果哈希码变了,说明形参已指向新实例,但外部变量的哈希码不会变
那怎么让外部真正“换对象”?
Java 不支持直接修改调用方的引用变量,但可通过以下方式间接实现:
- 返回新对象,由调用方主动赋值:obj = updateObj(obj);
- 传入容器(如 MyObj[] holder = {obj}),再修改 holder[0] = new MyObj();
- 使用可变包装类(如自定义 Holder
或 AtomicReference )
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










