Java析構方法是什麼?
析構方法與構造方法相反,當物件脫離其作用域時(例如物件所在的方法已呼叫完畢),系統自動執行析構方法。析構方法往往用來做清理垃圾碎片的工作,例如在建立物件時用 new 開闢了一片記憶體空間,應退出前在析構方法中將其釋放。
在 Java 的 Object 類中還提供了一個 protected 型別的 finalize() 方法,因此任何 Java 類都可以覆蓋這個方法,在這個方法中進行釋放物件所佔有的相關資源的操作。
物件的 finalize() 方法具有如下特點:
垃圾回收器是否會執行該方法以及何時執行該方法,都是不確定的。
finalize() 方法有可能使用物件復活,使物件恢復到可觸及狀態。
垃圾回收器在執行 finalize() 方法時,如果出現異常,垃圾回收器不會報告異常,程式繼續正常執行。
例如:
protected void finalize() { // 物件的清理工作}
例 1
下面通過一個例子來講解析構方法的使用。該例子計算從類中例項化物件的個數。
1)Counter 類在構造方法中增值,在析構方法中減值。如下所示為計數器類 Counter 的程式碼:
public class Counter { private static int count = 0; // 計數器變數 public Counter() { // 構造方法 this.count++; // 建立例項時增加值 } public int getCount() { // 獲取計數器的值 return this.count; } protected void finalize() { // 析構方法 this.count--; // 例項銷燬時減少值 System.out.println("物件銷燬"); }}
2)建立一個帶 main() 的 TestCounter 類對計數器進行測試,示例程式碼如下:
public class TestCounter { public static void main(String[] args) { Counter cnt1 = new Counter(); // 建立第一個例項 System.out.println("數量:"+cnt1.getCount()); // 輸出1 Counter cnt2 = new Counter(); // 建立第二個例項 System.out.println("數量:"+cnt2.getCount()); // 輸出2 cnt2 = null; // 銷燬例項2 try { System.gc(); // 清理記憶體 Thread.currentThread().sleep(1000); // 延時1000毫秒 System.out.println("數量:"+cnt1.getCount()); // 輸出1 } catch(InterruptedException e) { e.printStackTrace(); } }}
執行後輸出結果如下:
數量:1
數量:2
物件銷燬
數量:1
技巧:由於 finalize() 方法的不確定性,所以在程式中可以呼叫 System.gc() 或者 Runtime.gc() 方法提示垃圾回收器儘快執行垃圾回收操作。
更全面的Java知識:2022年最新整理Java合集_Java適合初學者的教程_Java名師手把手圖解教程想要學Java不知道從哪開始的朋友抓緊了