2016-06-20 73 views
0
public class SuperClass { 

private final Object finalizerGuardian = new Object(){ 
    @Override 
    protected void finalize(){ 
     System.out.println("SuperClass finalize by the finalizerGuardian"); 
    } 
}; 

@Override 
protected void finalize(){ 
    System.out.println("SuperClass finalize by the finalize method"); 
} 

public static void main(String[] args) throws Exception{ 
    SubClass sub = new SubClass(); 
    sub = null; 
    System.gc(); 
    Thread.sleep(500); 
} 


public class SubClass extends SuperClass{ 

@Override 
public void finalize(){ 
    System.out.println("SubClass finalize by the finalize method"); 
} 

它是一個終結者守護者在anoymous類,爲什麼這個終結者守護者總是被稱爲超類運行?thx時。關於終結者守護進程

回答

1

這是因爲當調用System.gc()時沒有可達的SuperClass實例。完成監護人對象是實例屬性,因此必須完成。沒有「班級,那是跑步」這樣的實體。

main方法的確在超類中,但它對它的實例沒有任何意義。

0

finalizerGuardian是一個實例(不是靜態的或類變量)對象,並且由於已取出/ null'ed提及亞類中,未引用的實例對象finalizerGuardian也立即收集。

作爲一個實例對象,它僅在SubClass存活之前才存在。

0

即使finalizerGuardian是一個匿名類,它也知道GC。所以當GC運行時,它會查找可以從內存中清除的對象並調用它們的finalize()方法。

每次您有SuperClass的實例時,您的finalizerGuardian實例將被構造並因此可用於GC。

+0

我知道它在調用這個main方法時創建了一個finalizerGuardian的實例,但是它並沒有創建超類對象,因爲它只是創建了一個子類對象,所以爲什麼這個finalizerGuardian被調用了? – Carlos

+0

啓動一個調試器,你會看到finalizerGuardian將在創建SubClass時實例化。這是繼承的特點之一。 – Frank