Java中将两个对象赋值给同一变量的结果及旧对象内存状态
Java对象赋值与内存管理常见问题解析
问题1:将两个对象赋值给同一个变量会发生什么?
嘿,这可是Java入门阶段绕不开的核心概念——引用变量和对象的关系。在Java里,你声明的像ClassA obj这样的变量,其实存的不是对象本身,而是对象在堆内存里的引用地址。
举个具体的例子:
// 第一步:创建第一个ClassA对象,obj变量保存它的引用 ClassA obj = new ClassA(); // 第二步:创建第二个ClassA对象,把新对象的引用赋值给obj obj = new ClassA();
这时候发生的事情是:
- 第一个ClassA对象还好好待在堆内存里,但原来指向它的
obj变量现在已经转而指向第二个对象了。 - 如果没有其他任何变量或引用还指向第一个对象,那它就成了无引用的垃圾对象,等着Java的垃圾回收器(GC)来处理它的内存。
简单说:变量只是个“指针”,赋值操作只是让这个指针换个对象指,旧对象本身不会立刻消失,只是没人“认领”它了。
问题2:执行ClassA classa = new ClassA(); classa = new ClassA();,旧对象会发生什么?会被删除还是仍驻留在内存中?
这个问题刚好是上面场景的延伸,直接给你说清楚:
- 旧对象不会立刻被删除,它会暂时驻留在内存里。Java的垃圾回收机制是自动的,它不会在你刚把引用移走就马上回收这个对象。
- 只有当垃圾回收器运行,并且检测到这个旧对象没有任何存活的引用指向它时,才会释放它占用的内存空间。
- 注意:你没法手动强制触发垃圾回收(虽然可以调用
System.gc(),但这只是给JVM一个建议,它不一定会立刻执行),内存回收的时机完全由JVM决定。
总结一下:旧对象不会凭空消失,它会留在内存直到GC判定它是垃圾,然后在合适的时机回收。
内容的提问来源于stack exchange,提问作者Hussein AlHroub
相关产品推荐
相关产品推荐

