当堆栈帧中的对象引用变量被赋新值时,它到底发生了什么?



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

换言之,假设你有这样一个程序:

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

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

形象

让我们按顺序分析代码:

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

相关内容