首頁 > Java > java教程 > Java 中的析構函數

Java 中的析構函數

WBOY
發布: 2024-08-30 15:26:43
原創
1152 人瀏覽過

Java中的析構函數可以透過Java中的finalize方法來學習。概念與finalize方法相同。 Java 在垃圾收集的幫助下適用於除析構函數以外的所有函數。因此,如果需要呼叫析構函數,可以藉助finalize方法來完成。此方法不是獨立的,因為它依賴垃圾收集。垃圾收集器是刪除或銷毀堆區域中未使用的物件的執行緒。假設物件連接到檔案或某些資料庫應用程式或網路連接,在刪除或銷毀物件之前,它必須在垃圾收集發生之前關閉與這些資源相關的所有連接。函數的關閉是透過呼叫 Finalize 方法來完成的。

Java 中析構函數 的定義

“ 析構函數是在物件銷毀時呼叫的方法。「 析構函數的主要目標是釋放分配的記憶體並清理資源,例如關閉開啟的檔案、關閉資料庫連線、關閉網路資源等,

廣告 該類別中的熱門課程 JAVA 掌握 - 專業化 | 78 課程系列 | 15 次模擬測驗

文法

class Object
{
protected void finalize()
{
//statements like the closure of database connection
}
}
登入後複製

Java 中的析構函數如何運作?

析構函式在java中有一個finalize()方法,與C++中的析構函式類似。當物件被創建時,它們被儲存在堆記憶體中。這些可由主執行緒或子執行緒存取。因此,當主執行緒或其子執行緒不再使用這些物件時,它們就有資格進行垃圾回收,並且現在獲取的記憶體可供創建的新物件使用。在物件被垃圾收集器收集之前,JRE(Java Runtime Environment)會呼叫finalize()方法來關閉輸入輸出流、資料庫連線、網路連線等。請注意,呼叫的finalize方法是受保護的。為什麼 Finalize 是受保護的,因為它既可以被基底類別調用,也可以被衍生類別調用? Finalize 方法存在於 Object 類別中。因此,如果您想從其他物件呼叫此 Finalize 方法,您可以將其變更為 public。

文法:

protected void finalize throws Throwable()
{
//Keep some resource closing operations here
}
登入後複製

finalize() 方法

  1. finalize() 方法受 java.lang.Object 類別中定義的保護。
  2. finalize() 方法只被呼叫一次。
  3. 要重寫finalize()方法,需要明確呼叫finalize方法。
  4. GC()是JVM執行垃圾回收的一個服務;當堆記憶體已滿並且需要記憶體來容納新到達的物件時呼叫它。
  5. JVM 會忽略除了 Finalize 方法中發生的未經檢查的異常之外的所有異常。

範例#1

在下面的程式中,呼叫了 String 類別對應的 Finalizes 方法,而不是程式中存在的 Finalize 方法。這裡重寫了finalize方法。

代碼:

public class Demo
{
public static void main(String[] args)
{
Integer i = new Integer(2);
i = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("object is garbage collected ");
}
}
登入後複製

輸出:

Java 中的析構函數

範例#2

在下面的程式中,內部呼叫了finalize方法;無需明確呼叫。

代碼

public class Demo
{
public static void main(String[] args)
{
Demo dm = new Demo();
dm = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("object is garbage collected ");
}
}
登入後複製

輸出:

Java 中的析構函數

範例#3

在下面的程式中,根據建立的物件數量在內部呼叫finalize。

代碼

public class NewProgram{
public void finalize(){
System.out.println("object is garbage collected");
}
public static void main(String args[]){
NewProgram np1=new NewProgram(); //first instantiation of Class NewProgram
NewProgram np2=new NewProgram(); //second instantiation of Class NewProgram
np1=null;
np2=null;
System.gc();
System.out.println("In the Main Method");
}
}
登入後複製

輸出:

Java 中的析構函數

範例#4

在下面的程式中,建立了兩個對象,並且呼叫了一次 Finalize,因為這兩個物件都指向同一個物件。

代碼:

public class NewProgram{
public void finalize(){
System.out.println("garbage collected");
}
public static void main(String args[]){
NewProgram np1=new NewProgram(); //first instantiation of Class NewProgram
NewProgram np2=new NewProgram(); //second instantiation of Class NewProgram
np1 = np2; // both now pointing to same object
System.gc();
System.out.println("in the Main Method");
}
}
登入後複製

O輸出:

Java 中的析構函數

範例#5

在下面的程式中,finalize 方法將會被明確和內部呼叫兩次。

代碼

public class Demo
{
public static void main(String[] args)
{
Demo dm = new Demo();
dm.finalize();
dm = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("garbage collected ");
}
}
登入後複製

輸出:

Java 中的析構函數

範例#6

在下面的程式中,在明確呼叫 Finalize 方法時呼叫了算術異常,這進一步導致了異常並停止了剩餘程式的執行。

代碼:

public class Demo
{
public static void main(String[] args)
{
Demo dm = new Demo();
dm.finalize();
dm = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("garbage collected ");
System.out.println(10 / 0);
}
}
登入後複製

輸出:

Java 中的析構函數

範例#7

下面的程式中沒有呼叫異常,因為它沒有明確呼叫並繼續執行其餘程式。

Code:

public class Demo
{
public static void main(String[] args)
{
Demo dm = new Demo();
dm = null;
System.gc();
System.out.println("In the Main Method");
}
protected void finalize()
{
System.out.println("garbage collected ");
System.out.println(10 / 0);
}
}
登入後複製

Output:

Java 中的析構函數

Advantages of Destructor in Java

  1. The destructor destroys the value created by the constructor to space in heap memory.
  2. Destructor is always called at the end of the program.
  3. Destructor is never overloaded destructor doesn’t take any argument.
  4. No need to define our constructor; the compiler creates for us one.

Conclusion

I hope this article was interesting and informative both for you to learn the topic. This article given has covered almost all the topics you are looking for, and I hope fulfills all of your requirements.

以上是Java 中的析構函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板