Java中如何在实例方法中创建新实例并赋值给调用方法的对象
为什么你的代码行不通?
Java 中 this 是隐式 final 修饰的当前实例引用,语言规范明确禁止在实例方法内部对 this 赋值,因此 this = new A() 会直接编译失败。
而单独写 new A() 只会创建一个没有任何引用指向的临时对象,会被立刻标记为垃圾回收,完全不会改变原调用对象的引用指向。
本质原因是 Java 是值传递:实例方法内部拿到的只是原引用的副本,就算强行修改这个副本的指向,也影响不到调用方的原始引用变量。
可行的实现方式
要实现「调用方法后,原变量引用切换为新实例」的效果,需要从修改调用方的引用本身入手,不能试图在方法内部修改当前实例。
方式1:方法返回新实例,调用方手动赋值
这是最常规的实现方案:
class A { // 方法返回全新的A实例,而非修改当前对象 A method() { return new A(); } public static void main(String[] args) { A obj = new A(); // 调用后手动把原引用替换为方法返回的新实例 obj = obj.method(); } }
方式2:用引用容器包装原对象
如果需要在方法内部统一完成替换,不需要每次调用都手动赋值,可以用引用容器(比如AtomicReference,或者自定义的简单包装类)包裹原对象:
import java.util.concurrent.atomic.AtomicReference; class A { void method(AtomicReference<A> ref) { // 直接修改容器内部存储的引用,原绑定的对象就会被替换 ref.set(new A()); } public static void main(String[] args) { // 用容器包裹原始A实例 AtomicReference<A> objRef = new AtomicReference<>(new A()); // 调用方法后,容器内部已经替换为新的A实例 objRef.get().method(objRef); } }
内容的提问来源于stack exchange,提问作者Willian Pinheiro
相关产品推荐
相关产品推荐

