Java是值传递还是引用传递?
面试回答¶
面试官: Java 里是值传递还是引用传递?
你:
Java 只有值传递,没有引用传递。 很多人搞混,是因为没分清楚“传递引用副本”和“传递引用本身”的区别。
基本类型没什么好说的: 传的就是值的副本,方法里怎么改形参都不影响外边的实参。
对象的情况要抠字眼: 你传一个对象,其实传的是对象引用的副本,而不是对象的副本,也不是引用本身。副本指向同一个对象,所以你可以在方法里修改对象的状态(比如 setName),外边的对象跟着变。但如果你在方法里让这个引用副本指向另一个新对象,外边的原引用完全不受影响。如果真是引用传递,形参就是实参的别名,形参指到哪,实参就应该跟到哪,但 Java 做不到这点。 所以它是值传递——传的是引用值。
用一段代码和时序图说明就更清楚了:

如果 Java 是引用传递,最后一行就该变成王五,但实际不是。 这证明了方法里获得的只是一个可以操作对象内容的“电话号码副本”,你弄丢了副本换了一张新卡,不影响原来持有那张卡的人。
最后上个保险: 如果你真需要在方法里改变外部引用,就得把引用包装一层,比如用数组或者 AtomicReference,但这就是另一个话题了。记死一句话就行:Java 把引用的值传了一份,所以叫值传递。