【发布时间】:2021-11-29 21:10:58
【问题描述】:
我相信这是一个简单的问题,但我一直无法找到直接的答案。如果在同一方法中将引用变量替换为新实例,堆栈中的引用变量会发生什么情况?
换句话说, 假设您有一个执行此操作的程序:
...void main(...){
someClass x = new someClass(false);
x.doSomething();
x = new someClass(true);
x.doSomething();
}
我了解对象引用变量放置在指向堆中对象的堆栈帧中(如果我错了,请纠正我)。当我用 someClass() 的新实例替换 x 时,堆栈中对象引用变量的现有引用值是否更改为指向新对象,或者堆栈帧中的旧引用变量是否被丢弃并替换为新对象指向新对象的对象引用变量?引用变量是可变的吗?这一切都发生在同一个堆栈帧中,还是发生了其他事情?
【问题讨论】:
-
堆栈中的对象引用变量的现有引用值是否更改为指向新对象,或者堆栈帧中的旧引用变量被丢弃并替换为新的对象引用指向新对象的变量 您的心智模型在这些之间的差异尚不清楚。你试过画一个栈帧吗?
-
引用变量是可变的吗?您可以通过将它们声明为 final 来创建不可变(引用)变量(和字段):
final someClass x = new someClass(false); final int maxSize = 15;。如果你这样做,你以后不能重新分配一个新值(即x = new someClass(true);不再编译)。如果您不将它们声明为 final,它们是可变的,您可以为其分配一个新值。 -
我制作了一张图片,试图展示我的想法:i.ibb.co/108WywS/drawing.png 如果有意义,请告诉我。
-
对我来说,“删除并替换引用变量”的整个概念没有意义。 JVM应该如何实现呢?通过递增然后递减堆栈指针?但是如果引用变量不在栈顶,而是在其他变量之间的夹层位置呢?
-
引用变量在内存中占据一个位置。当它被重新分配时,该内存位置的内容会发生变化。 “删除和替换”在这里没有任何意义。