我有一个带有 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 对象超出范围时,终结器监护人的 finalize() 被调用,我从子类的 finalize 方法中获取 SYSO,但从不从 super 的 finalize 中获取。
我很困惑。我从根本上误解了什么吗?
免责声明:我意识到终结器是危险的,不可取的,等等。仍然试图理解这里的问题。