You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java对象引用传递问题:为什么示例代码运行输出15而不是0

运行结果原理解析

Java中所有方法参数都是值传递,对于引用类型的参数,传递的是「对象引用的拷贝」,而非原引用本身,这是出现该运行结果的核心原因。

执行流程拆解

  • 进入playGame方法后,首先实例化一个Ball对象,调用setSpeed将其speed属性设为10,此时方法内的ball变量存储的是该对象的内存地址。
  • 调用passBall方法时,会将playGame中ball变量存储的地址复制一份,赋值给passBall的形参ball,两个变量此时指向同一个Ball对象。后续执行ball.setSpeed(ball.getSpeed() + 5),修改的是共同指向的对象的属性,因此该对象的speed变为15,该修改对所有指向该对象的引用生效。
  • 调用catchBall方法时,同样将passBall中形参ball存储的地址复制一份,赋值给catchBall的形参ball,三个变量暂时指向同一个speed为15的Ball对象。
  • catchBall方法内首先实例化了一个新的Ball对象,将其speed设为0,随后执行ball = newBall:这里修改的是catchBall方法自身持有的引用拷贝的指向,让它指向新创建的Ball对象,该操作完全不会影响外部playGame、passBall中存储的原引用指向,外部引用仍然指向最开始的、speed为15的Ball对象。
  • 调用结束回到playGame方法后,打印的是原对象的speed属性,因此输出结果为15。

类比理解

可以把对象引用理解为打开对象的钥匙:你把自己的钥匙复制一份交给他人,他人拿这把钥匙修改了你房子内的陈设(调用set方法修改对象属性),你回家后会看到变化;但如果他人把自己手里的复制钥匙改造成开另一套新房子的钥匙,对你手里的原配钥匙没有任何影响,你依然可以打开原来的房子。

内容的提问来源于stack exchange,提问作者gsong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:27:02