1. 程式人生 > 其它 >Java析構方法是什麼?

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不知道從哪開始的朋友抓緊了