JJava 知识库
JAVA INTERVIEW

高频面试题

Java基础基础约 1 分钟

把一个订单 DTO 传给方法后,方法里修改字段会影响外面,但给参数重新赋值却没影响,为什么?

参考回答约 1 分钟 · 口语表达
我的判断

Java 永远按值传递;对象参数传递的是引用值的副本,所以能通过它改对象,却不能靠给形参重新赋值来替换调用方变量。

调用方法时,外面的 order 引用被复制了一份给形参。执行 param.setStatus(...) 时,两份引用指向同一个订单对象,所以外面能看到字段变化;执行 param = new OrderDTO() 只是让方法里的那份副本改指向,新对象和外部变量没有关系。

void update(OrderDTO param) {
  param.setStatus("PAID"); // 外部能看到
  param = new OrderDTO();   // 只改变局部形参
}

项目里真正要解决的是副作用边界。如果方法只负责计算,我会返回新 DTO 或不可变结果,不直接修改传入对象;如果约定就是填充字段,方法名和文档会明确写出来,避免调用方以为输入不会变化。