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()的用法:当一个对象要被清理的时候,它应该处于某个状态,使它所占的内存被安全地释放。例如:要是对象那个代表了一个打开的文件,在对象回收前,应该先关闭这个文件。