java - 当堆栈帧中的对象引用变量分配一个新值时,它究竟会发生什么?
问题描述
我相信这是一个简单的问题,但我一直无法找到一个直接的答案。如果在同一方法中用新实例替换堆栈中的引用变量,会发生什么情况?
换句话说,假设您有一个执行此操作的程序:
...void main(...){
someClass x = new someClass(false);
x.doSomething();
x = new someClass(true);
x.doSomething();
}
我了解对象引用变量放置在指向堆中对象的堆栈帧中(如果我错了,请纠正我)。当我用 someClass() 的新实例替换 x 时,堆栈中对象引用变量的现有引用值是否更改为指向新对象,或者堆栈帧中的旧引用变量是否被丢弃并替换为新对象指向新对象的对象引用变量?引用变量是可变的吗?这一切都发生在同一个堆栈帧中,还是发生了其他事情?
解决方案
让我们依次分析代码:
someClass x = new someClass(false);
:x
持有对新分配的 class 对象的引用someClass
。x.doSomething();
:以对象为对象doSomething()
调用该方法。如果该方法存储到另一个对象中,它将被多次引用。x
this
this
x = new someClass(true);
:x
现在持有对另一个新分配的 class 对象的引用someClass
。先前的对象不再被 引用x
,因此它可能会在某个时候被垃圾收集器回收,除非引用已通过doSomething()
方法或可能由构造函数存储在其他地方。
推荐阅读
- sql - 重复值插入,当使用可序列化的隔离级别时
- android - HttpConnection 错误 500
- python - 数组 fileld postgres 中最常见的词
- java - 运行时 exec 不显示结果
- javascript - 如何从节点js中的doc文件第一页生成拇指
- javascript - 按钮单击时 JQuery 中的 ConfirmDialog() 自动关闭
- java - 异步处理输入请求并同步执行它们
- python - 如何在 Python 字典中转换包含以下输出的表?
- apache-spark - 在设定频率后刷新缓存的 Spark Dataframe
- node.js - 在使用 Node.js/Express 进行重定向时,如何防止浏览器将 Authorization 标头发送到新位置?