今天不想写长文,先把 Java 对象、引用和值传递到底怎么理解 这块拆成几条短一点的问答。面试里经常会被连续追问,如果只背一句定义,第二问基本就卡住了。

先说我自己的结论

区分变量里保存的是值还是对象引用,避免把参数传递讲混。

我现在会先把这类题分成“定义是什么、为什么这样设计、代码里怎么用、容易翻车在哪”四层去答。这样比死背一段话稳很多。

快问快答

  • 基本类型传递的是值副本。
    我现在的理解:先记结论,再回到代码里找一个能验证它的场景。
  • 引用变量的副本仍然指向同一个对象。
    我现在的理解:先记结论,再回到代码里找一个能验证它的场景。
  • 重新赋值和修改对象字段不是一回事。
    我现在的理解:先记结论,再回到代码里找一个能验证它的场景。

如果在项目里问到我

我会直接拿这个场景来讲:写两个小方法分别修改字段和重新赋值,观察调用方对象是否变化。

这样回答有个好处,不会显得像在背书,因为每一句都能落到接口、表结构、线程、缓存或者日志上。

一个最小例子

1
2
3
4
5
public Result<Void> handle(Command command) {
validator.check(command);
service.execute(command);
return Result.ok();
}

这个例子不求大而全,只求能把核心点钉住。写完后我一般会补一个反例,看看自己是不是只会顺着讲。

我会继续追问自己什么

  • 这道题最容易和哪个概念混在一起。
  • 如果业务量上来,它会不会变成性能问题。
  • 如果线上出故障,我第一步会看日志、线程、SQL 还是缓存。

参考资料