Java 中的解構函式

Hiten Kanwar 2021年10月2日
Java 中的解構函式

解構函式與建構函式相反。一方面,建構函式用於初始化物件,解構函式用於銷燬(刪除)物件,從而釋放物件佔用的資源。

本教程將討論 Java 中的解構函式、它們的工作方式和方法。

Java 沒有解構函式,也沒有直接的等價物。然而,它是一種強大的語言,其中一個原因是垃圾收集器。Java 為我們提供了一個垃圾收集器,其工作方式類似於解構函式。垃圾收集器,一個執行在 Java 虛擬機器(JVM)上的程式(執行緒),通過刪除未使用的物件來自動釋放記憶體。

在 Java 中,記憶體的分配和釋放由這個垃圾收集器有效地處理。當一個物件的生命週期完成時,垃圾收集器出現,刪除該物件,並釋放或釋放該物件佔用的記憶體。這種方法也稱為非確定性的終結器。但問題是此方法(終結器)的呼叫無法保證,因為它是隱式呼叫的。

Java 中解構函式和 Finalize() 方法的工作

在 Java 中建立物件時,它會佔用堆中的記憶體。執行緒進一步使用這些物件,如果一個執行緒不使用該物件,它們將有資格被垃圾收集器進行垃圾收集。因此,這些物件佔用的記憶體現在變為空置,可以被任何新實體進一步利用。當垃圾收集器銷燬任何物件時,Java 執行時環境 (JRE) 會呼叫 finalize() 方法來關閉連線,例如網路和資料庫連線。

我們不能強制垃圾收集器執行和銷燬物件。但是 Java 在這裡提供了另一種方法。java 物件為我們提供了 finalize() 方法,其工作方式類似於解構函式。但是,它只能呼叫一次。

需要理解的一點是 finalize() 方法不是解構函式,而是提供額外的安全性並進一步確保外部資源,例如在關閉操作(程式)之前關閉檔案,並且與解構函式的工作方式非常相似。

請參考下面的程式碼。

public class Dest_java {
    public static void main(String[] args) {
        Dest_java des = new Dest_java();  
        des.finalize();  
        des = null;  
        System.gc();  
        System.out.print("main() method ");  
    }  
    protected void finalize() {
        System.out.print("Destroyed ");  
    }  
}  

輸出:

Destroyed main() method Destroyed