首页 > 解决方案 > 当堆栈帧中的对象引用变量分配一个新值时,它究竟会发生什么?

问题描述

我相信这是一个简单的问题,但我一直无法找到一个直接的答案。如果在同一方法中用新实例替换堆栈中的引用变量,会发生什么情况?

换句话说,假设您有一个执行此操作的程序:

...void main(...){
someClass x = new someClass(false);
x.doSomething();
x = new someClass(true);
x.doSomething();
}

我了解对象引用变量放置在指向堆中对象的堆栈帧中(如果我错了,请纠正我)。当我用 someClass() 的新实例替换 x 时,堆栈中对象引用变量的现有引用值是否更改为指向新对象,或者堆栈帧中的旧引用变量是否被丢弃并替换为新对象指向新对象的对象引用变量?引用变量是可变的吗?这一切都发生在同一个堆栈帧中,还是发生了其他事情?

图片

标签: javamemory-management

解决方案


让我们依次分析代码:

  • someClass x = new someClass(false);:x持有对新分配的 class 对象的引用someClass
  • x.doSomething();:以对象为对象doSomething()调用该方法。如果该方法存储到另一个对象中,它将被多次引用。xthisthis
  • x = new someClass(true);:x现在持有对另一个新分配的 class 对象的引用someClass。先前的对象不再被 引用x,因此它可能会在某个时候被垃圾收集器回收,除非引用已通过doSomething()方法或可能由构造函数存储在其他地方。

推荐阅读