我有一个带有finalize()方法的伸缩构造函数的超类。为了防止子类忘记调用super.finalize,我写了一个终结者监护人(EJ Item 7)。
public class Super {
public Super() {}
{
Object finalizerGuardian = new Object() {
@Override
protected void finalize() {
System.out.println("Finalizer guardian finalize");
Super.this.finalize();
}
};
}
protected void finalize() {
System.out.println("Super finalize");
}
}这里是一个示例子类 -
public class Sub extends Super {
public Sub() {}
protected void finalize() {
System.out.println("Sub finalize");
}
public static void main(String[] args)
throws InterruptedException {
if (1 == 1) {
Sub s1 = new Sub();
}
Runtime.getRuntime().gc();
Thread.sleep(10000);
}
}当s1对象超出作用域时,finalizer监护人的finalize()被调用,并且我从子类的finalize方法中获得SYSO,但从未从super的finalize中获得该成员。
我很困惑。我是否从根本上误解了某些东西?
免责声明:我意识到终结者是危险的,不可取的等等。仍然试图在这里理解问题。