Java允許在類中定義一個名為finalize()的方法。它的工作原理是:一旦垃圾回收器准備好釋放對象占用的存儲空間,將首先調用其finalize()方法。並且在下一次垃圾回收動作發生時,才會真正回收對象占用的內存。
關於垃圾回收,有三點需要記住:
1、對象可能不被垃圾回收。只要程序沒有瀕臨存儲空間用完的那一刻,對象占用的空間就總也得不到釋放。
2、垃圾回收並不等於“析構”。
3、垃圾回收只與內存有關。使用垃圾回收的唯一原因是為了回收程序不再使用的內存。
finalize()的用途:
無論對象是如何創建的,垃圾回收器都會負責釋放對象占據的所有內存。這就將對finalize()的需求限制到一種特殊情況,即通過某種創建對象方式以外的方式為對象分配了存儲空間。不過這種情況一般發生在使用“本地方法”的情況下,本地方法是一種在Java中調用非Java代碼的方式。
finalize()方法還有一個有趣的用法,就是對象終結條件的驗證。簡單的說就是通過調用finalize()來發現一些隱晦的缺陷。例如:
class Book{ boolean checkedOut = false; Book(boolean checkOut){ checkedOut = checkOut; } void checkIn(){ checkedOut = false; } protected void finalize(){ if (checkedOut){ System.out.println("Error: checked out "); } } } public class TerminationCondition { public static void main(String[] args){ Book novel = new Book(true); novel.checkIn(); new Book(true); System.gc(); } }
本例的終結條件是:所有的Book對象在被當作垃圾回收前都應該被簽入。但在main方法中,由於程序錯誤,有一本書未被簽入。要是沒有finalize()來驗證終結條件,將很難被發現這種缺陷。