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

将对象引用赋值为null后为何ArrayList和Stack中存储的对应值未变为null

问题原因解释

核心逻辑是:ex1 = null仅会断开ex1这个引用本身和堆中实例对象的关联,完全不会影响其他指向该对象的引用。
整个代码的执行过程可以拆解为以下几步:

  • 执行Example ex1 = new Example()时,JVM会在堆内存中创建一个Example类的实例对象,同时在栈内存中生成ex1引用,该引用存储的是堆中实例对象的内存地址,指向这个实例。
  • 给ex1.age赋值为15时,是通过ex1引用找到堆中的实例,直接修改实例的age属性值。
  • 执行ex.add(ex1)、st.push(ex1)时,集合存储的不是ex1引用本身,而是复制了一份ex1中保存的堆对象地址,存到集合的元素空间中。此时共有3个独立的引用同时指向同一个堆实例:栈中的ex1引用、ArrayList第0位的元素引用、Stack栈顶的元素引用。
  • 执行ex1 = null时,仅会把栈中ex1这个引用自身存储的地址值清空,让它不再指向堆中的实例。集合中存储的另外两份引用副本完全没有被修改,仍然正常指向原本的堆实例。

所以你通过集合取出引用访问age属性时,访问的还是原来的堆实例,自然会输出15。

补充说明:Java中所有赋值、参数传递都是「值传递」,引用类型传递的是「引用所存储的内存地址的副本」,而非引用本身,修改原有引用的指向不会对副本产生任何影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 22:06:05