public class Finalize {
protected void finalize() { System.out.println("finalize"); }
public static void main(String[] args) {
new Finalize(); new Finalize();
System.gc();
}
}
運行多次,輸出可能 0 行、1 行或 2 行 "finalize"。
finalize() 確實被 GC 線程調用了兩次 (兩個對象)。System.out (PrintStream) 也是對象,JVM 關閉時會銷毀對象。**銷毀順序不確定**:
System.out 先於兩個 Finalize 對象銷毀 → 輸出流關閉,println 無輸出 (0 行)。Finalize 先銷毀 → 輸出 1 行。System.out 最後銷毀 → 輸出 2 行。不可依賴 finalize 進行關鍵資源釋放或輸出**。應使用 try-with-resources、AutoCloseable 或顯式 close() 方法。