Java 为什么这种从被破坏的JDialog中检索字段的方法有效? 上下文

Java 为什么这种从被破坏的JDialog中检索字段的方法有效? 上下文,java,swing,scope,jdialog,Java,Swing,Scope,Jdialog,为了学习如何使用定制的JDialogs进行非琐碎的、经过验证的数据输入,我搜索并找到了一个与之密切相关的问题 我不明白的是,为什么提供的答案中的代码有效 我的问题 由于JDialog对象在其匿名ActionListener的actionPerformed()方法中执行了setVisible(false)和dispose(),因此在调用方返回程序流并尝试获取字段时,垃圾收集器不应该已经销毁了这些字段吗?dispose将只处理对话框所持有的本机对等资源。如果您仍然有一个对JDialog的引用,那么它

为了学习如何使用定制的
JDialog
s进行非琐碎的、经过验证的数据输入,我搜索并找到了一个与之密切相关的问题

我不明白的是,为什么提供的答案中的代码有效

我的问题
由于
JDialog
对象在其匿名
ActionListener
actionPerformed()
方法中执行了
setVisible(false)
dispose()
,因此在调用方返回程序流并尝试获取字段时,垃圾收集器不应该已经销毁了这些字段吗?

dispose
将只处理对话框所持有的本机对等资源。如果您仍然有一个对
JDialog
的引用,那么它将不符合垃圾收集的条件,因为您仍然有一个对它的强引用。我假设您仍然有对对话框的引用,因为否则,您将如何尝试获取由它管理的值

垃圾收集也不会马上发生

根据你的相关问题

FObjectDialog fod = new FObjectDialog(this);
//...
String name = fod.getName();

通过
fod
,仍然有对
FObjectDialog
的强烈引用。因此,在
fod
退出上下文(方法返回)、取消引用(
fod=null;
)或重新分配之前,
fod
(以及扩展的对话框)将不符合垃圾收集的条件。

Hi:)。当然,这都是关于参考的!!从C++背景来看,我仍然很难习惯用JVM管理我的内存“以一种聪明的方式”。另一方面,我知道GC可能需要一段时间,但它似乎仍然有点不安全。我想我不清楚什么是“本地对等资源”。@MHaaZ检查更新。所有Swing组件都共享一个通用的本地对等点(它与每个窗口相关联),它是Swing API和操作系统之间的连接,允许Swing进行绘制等操作。允许窗口释放这些资源允许系统释放内存,并且在您可能希望再次重用该窗口(类似于
JFileChooser
)时非常有用,因为重新创建本机对等对象比创建整个对象更快(有时)