java虛擬機中的內存清理,是通過垃圾回收器來進行清理的,這個過程是不需要程序員來操心。一個對象被用完之後,在某個時間段就會被回收,如果這個對象用完之後就“棄之不顧”,或許會有一些安全問題。因此這個方法存在的意義就是,這個對象被處理前能做的最後一件事。
finalize()是object類的一個方法,當堆中的對象被回收時,會先調用這個方法,然後對象纔會被銷燬。
先來看一段代碼:
下面的代碼中,將會創建一個禮物生產工廠對象,該對象重寫了finalize()方法。如果gifts倉庫中的禮物還沒有被拿完,就被銷燬的話,則會打印一條日誌。
import finalize.GiftFactory;
public class Test {
public static void main(String[] args) {
GiftFactory giftFactory = new GiftFactory();//創建一個對象,該對象一會兒將會被回收
giftFactory.createGift();//生產兩個禮物
giftFactory.createGift();
giftFactory.getGift();//拿走一個,此時倉庫中還有一個
giftFactory = null;//以便於被回收
System.gc();//提醒垃圾回收器進行回收
}
}
package finalize;
import java.util.Stack;
public class GiftFactory {
public void createGift () { //生產一個禮物
this.gifs.push("這是一個神奇的禮物~~");
}
public String getGift() { //返回一個禮物
return gifs.isEmpty() ? "" : gifs.pop();
}
@Override
protected void finalize() throws Throwable {
if(!gifs.isEmpty()) {
System.out.println("禮物還沒有拿完哦,不要浪費了!!!");
}
}
private Stack<String> gifs = new Stack<>(); //存貯禮物的容器
}
運行之後的結果:
D:\jdk\install\bin\java.exe ...
禮物還沒有拿完哦,不要浪費了!!!
Process finished with exit code 0
可以看到,GiftFactory對象在被銷燬的時候,先調用了finalize()方法。
用途
通過上述的例子可以總結出finalize()的用法:當一個對象要被清理的時候,它應該處於某個狀態,使它所佔的內存被安全地釋放。例如:要是對象那個代表了一個打開的文件,在對象回收前,應該先關閉這個文件。