2013-09-30 59 views
-3

我想調用析構函數,當我關閉對象時,但我不知道如何或何時,..我嘗試惠普finalize但它沒有調用。我不知道爲什麼調用析構函數關閉對象

有示例代碼,我試着用調試器,但它幫助我..

class tralala(){ 

    int i=0; 

    tralala(){ 
    i=i+1;} 
    protected void finalize(){ 
     i=i-1; 
    }} 

但它不是叫我不知道爲什麼。如果有人有一個建議幫助我。我現在陷入困境,但是我不確定java是否有析構函數。

+3

請使用更好的代碼格式。起初我認爲這甚至不會編譯。這是醜陋的,不可維護的。另外,請記住,根據Java的命名約定,您應該有以大寫字母開頭的類名稱... – ppeterka

+0

Java中沒有析構函數。因此你的問題一無所獲。 – EJP

+0

可能重複的[有沒有Java的析構?](http://stackoverflow.com/questions/171952/is-there-a-destructor-for-java) – Raedwald

回答

1

現在沒有在java

class Tralala(){ 

    int i=0; 

    Tralala(){ 
    i=i+1;} 

    protected void reset(){ 
     i=i-1; 
    }} 

電話時永遠要破壞reset方法沒有析構函數。

附註:在代碼中有很多更正,比如命名約定,格式和提供修飾符。

而我沒有得到,當最終確定調用時,您的實例不再。爲什麼你在那個時候重置,因爲在那之後沒有更多的操作這個對象。

+0

我需要自動調用的方法嗎? – Papi

+0

@Papi Nope.you無需重置,因爲它自我過期的對象。 –

1

JAVA沒有析構函數。 JAVA有垃圾收集器。垃圾收集器作爲線程運行並自動銷燬沒有任何活動引用的實例。

1

它取決於您關閉類的定義。

您可以實現接口Closable,這樣eclipse可以在需要時警告您不要關閉實例。

它不同於finalize,因爲你需要自己調用它。

您可以在finalize函數中調用close()以確保在實例被GC調用時它會被調用。

2

我認爲你正試圖實施類似的行爲,像析構函數。由於析構函數不適用於Java,因此我認爲您正在嘗試使用finalize。

但是,當一個對象將要收集垃圾時,會調用finalize方法。這可以在它有資格進行垃圾回收後的任何時候進行。 請注意,一個對象永遠不會被垃圾收集是完全可能的(因此finalize永遠不會被調用)。當對象永遠不符合gc條件時(因爲它可以在JVM的整個生命週期內到達),或者在對象變爲符合條件的時間和JVM停止運行的時間之間沒有真正運行垃圾收集時發生這種情況(這通常發生在您的程式)。


瞭解更多關於When is the finalize() method called in Java?Why not to use finalize() method in java


而讀How to implement object counter in Java SO QA您的解決方案。這用於對象計數器。你可以使用相同的邏輯。

2

方法finalize()當垃圾回收確定沒有更多的對象引用時,由對象上的垃圾回收器調用。所以它會在垃圾收集器觀察它被刪除後調用,但當對象離開作用域時不會立即被調用。

我真的不明白你的意思是什麼「近距離物體」?你應該找到一些其他的架構解決方案來做你想做的事情:也許只是調用你的方法,或者當對象離開作用域(「close object」)時用提供的處理程序引發一些自定義事件。

相關問題