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 を取得しますが、スーパーの finalize から SYSO を取得することはありません。
よくわかりません。私は何か根本的に誤解していますか?
免責事項:ファイナライザーは危険であり、お勧めできないことなどを認識しています。ここで問題を理解しようとしています。