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
相关产品推荐
相关产品推荐

