将对象引用赋值为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
相关产品推荐
相关产品推荐

