2016-06-20 72 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