import java.sql.SQLSyntaxErrorException;
/**
* finalize方法
* @author changxusw@sina.com
* @version 1.0
*/
public class FinalizeTest {
/*
* finalize方法存在的意义呢,是因为java有些时候会嵌入一些C/C++的代码
* 嵌入代码其实不要紧,要紧的是,代码里可能会用到malloc这样的方法,这就不好了
* 这样的方法会在堆栈上开辟内存空间,而垃圾处理器又只能盯着new开辟在堆上的对象不会去管malloc分配的内存
* 一旦malloc过分就会导致内存资源耗尽,除非再嵌入C代码写free方法
* 在哪写这个free呢?诶,java给了个地方---finalize方法
*
* finalize执行的过程是在垃圾回收器要清除本对象时,先执行finalize方法,而先不把这个对象清除掉
* 等到下一次再执行垃圾回收的时候,再把这个对象清除掉
*
* 这样一来,finalize又有一个新的用处,就是这个对象在被清除之前,应该处于什么状态,或者至少要做什么事
* 比如说,有一个对象打开了一个文件,那么在对象被清除之前,至少这个文件要被关闭
*
* 但是,你写了finalize不一定就会执行,JVM如果没有发现内存不够用,那么,就不会进行垃圾处理,程序结束资源自动释放
*
* 要是想一定执行finalize,可以使用这种方式,直接用new创建对象但是不赋值给任何变量,再使用System.gc()
*
* 尽管如此,我觉得写finalize方法也不是很好,还是逻辑设计上更清晰一些比较好
* */
/*
* 下面程序的意思是:可以使用带参数的构造器赋值isFull是真是假,在对象被销毁之前必须赋值为假
* */
private boolean isFull;
public FinalizeTest(boolean full) {
System.out.println("创建对象 isFull: "+full);
isFull = full;
}
public void finalize() {
System.out.println("执行finalize");
if (isFull) {
System.out.println("执行finalize并做处理");
isFull = false;
}
}
}
java中的finalize
最新推荐文章于 2024-09-13 21:40:38 发布