例如:
public class Test12 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
new Person();
new Person();
new Person();
System.out.println("the program is ending");
}
}
class Person {
public void finalize() {
System.out.println("the object is going");
}
}
编译运行的结果:
the program is ending 作者: qianfancy 时间: 2012-11-27 13:38
是一个回收垃圾的方法!
finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。 finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它。finalize就是一个对象的遗书,你把一个对象给杀了总的让他说点什么把。只不过你要注意finalize是垃圾回收启动来清理对象才来调用的,就算自己掉这个方法这个对象也不会就从内存消失的,代码楼上就行。还有就是这个遗书可以把自己复活,另外如果在这个方法抛异常会导致此对象的终结操作停止,这两种都是死而复生的手段。赞同0|评论
示例
public class ObjectGc {
public ObjectGc() {}
public static void main(String [] args) {
ObjectGc og = new ObjectGc(); //很明显,og没有存在的意义了
og = null; //由于垃圾回收是不定时的,我们还是手动回收看看吧
System.gc();
}
//当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
protected void finalize() {
System.out.println("我已经被垃圾回收器回收了...");
}
} 作者: 孙玉伟 时间: 2012-11-27 13:59
这是java中的垃圾回收机制,java中垃圾回收是jvm虚拟机自己调用的,无需像c,c++那样血药程序员自己写回收方法,这样能有效的防止内存溢出的问题,方便了开发。那你首先得知道finalize方法在什么条件下才会触发。类似于C++中的析构函数,虚拟机在回收对象实例时,会调用该对象的finalize方法。System.gc()会回收,并且触发,finalize();