finalize(),無需手動干預。finalize() 必須顯式調用 super.finalize(),否則基類清理邏輯缺失。
protected void finalize() {
println("衍生類清理");
try {
super.finalize(); // 必須最後調用
} catch (Throwable t) {}
}
關鍵點:
super.finalize() 放在 最後,保證基類組件在衍生類清理完成後再銷毀(衍生類清理可能依賴基類方法)。Throwable 防止異常中斷鏈式調用。類層次:Frog → Amphibian → Animal → LivingCreature,每層含 Characteristic 成員。
Frog.finalize(),成員對象自動清理,基類 finalize() 全被跳過。Frog → Amphibian → Animal → LivingCreature 順序調用,再清理成員。順序與構造完全相反,符合 C++ 解構器語義。成員對象按創建順序清理(與構造順序同),但規格未保證順序,不應依賴。基類清理順序則由程序員通過 super.finalize() 位置精確控制。
GC 不保證何時運行,甚至可能不運行。System.runFinalizersOnExit(true) 強制退出時調用,但已過時。現代 Java 推薦 try-with-resources / AutoCloseable 顯式管理資源。