java中finalize()的用法

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()的用法:當一個對象要被清理的時候,它應該處於某個狀態,使它所佔的內存被安全地釋放。例如:要是對象那個代表了一個打開的文件,在對象回收前,應該先關閉這個文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章