2013-05-14 150 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