2013-05-14 188 views
0

我有一个名为CounterGUI的对象。它创建一个GUI。我在另一个课程中创​​建它,比如MyProgram。如何删除类对象?

一旦MyProgram创建了一个CounterGUI对象,我该如何删除该对象?说如果我这样做:

CounterGUI first = new CounterGUI(); //displays the GUI 
first = null; 

我认为将对象设置为null会删除一切(包括图形用户界面),但它没有。我如何彻底删除它?

我不明白这是一个重复的问题,以前的答案是将其设置为空或一个新的对象,但这在这里不起作用。

+0

System.gc()就我所知,在你的代码之后,将是最好的选择。 – SenthilPrabhu 2013-05-14 05:06:41

+0

为了尽快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。 – 2013-05-14 05:06:55

+0

你的意思是说MyProgram正在显示GUI,但是在稍后阶段你希望它消失并且删除对象 – anshulkatta 2013-05-14 05:07:21

回答

0

你想消失,然后GUI dispose()

你不必担心,垃圾收集器会自动把它拿出来的内存或

你可以自己调用它

System.gc()

但这是不好的做法,以及不能保证它肯定会被收集。

+1

System.gc()不应该明确调用 - 它被认为是不好的。当你发现你自己调用它时,你必须知道你正在抓吸管,并且你必须找到一个不同的解决方案。 – 2013-05-14 05:20:59

+0

请一定详细说明不好,是否被oracle或Java的创建者气馁,请给我链接.. ?? – anshulkatta 2013-05-14 05:24:19

+0

此外,它不会在这里帮助,因为只要窗口处于活动状态,它将保持可到达状态,即使您将参考“无效”。 – 2013-05-14 05:25:40

1

假设CounterGUI是java.awt.Window,则:

  • 使窗口的方式消失是调用setVisible(false)

  • 将其从本机窗口完全断开连接的方式是致电dispose()

  • 一旦窗口已经disposed,使其无法访问(例如通过将null分配给所有引用它的变量)将使其有资格进行垃圾回收。

简单地分配nullWindow可见不会有任何效果。一个可见的窗口对象连接到各种东西,防止垃圾收集。

+0

[顶级容器没有敲定()](http://stackoverflow.com/questions/6309407/remove-top-level-container-on-runtime),然后dispose或setVisible是一样的 – mKorbel 2013-05-15 09:57:43

1

Java使用自动垃圾收集。当您将对象设置为null并且它是剩余的最后一个引用时,JVM将回收使用的内存。

然而,在你的情况下,它可能是一个线程被创建(GUI通常是这种情况),并且对当前对象的引用被赋予它。在这种情况下,将引用设置为null不起作用,因为其他内容仍然可以访问对象。

为了正确关闭您的GUI,您必须调用close方法。对于JFrame,你可以试试这个:

myGui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

当用户点击关闭按钮时将关闭应用程序。如果您想通过程序控制关闭,那么您可以尝试:

private void closeItDown() { 
    WindowEvent event = new WindowEvent(this, WindowEvent.WINDOW_CLOSING); 
    Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event); 
} 

...并调用此方法。你不必将任何东西设置为null,JVM就会在这时为你收集垃圾,也许。不能保证,但可能在这一点上,也许以后,还是现在......或者当:)

0
  1. 通过设置其引用删除对象为null使它符合垃圾回收和JVM会照顾去除所有这些对象。如果你想强制垃圾收集器运行,你可以发出System.gc()Runtime.gc(),但它仍然不能保证它将被收回回JVM。你可以找到垃圾收集器工作原理的进一步信息here

  2. 如果你想删除你的GUI窗口,你可以使用dispose()方法。

+0

不要调用' GC()'。一般来说这是一个糟糕的主意,在这种情况下它是徒劳的......除非你已经放弃了这个窗口。 – 2013-05-14 05:30:31

+0

@StephenC感谢您的建议。 – Ashish 2013-05-14 05:33:09