类似C++的OnDestroy()一样的,但是Java是在回收时调用。  因此只有垃圾收集时收集他时才会执行一些相关的操作——也就是你finalize()做的。
没有收集垃圾时不会执行的.

解决方案 »

  1.   

    谢谢上面高人的回答,但是以你这样的理解,t暂时被收集到垃圾收集堆了,但是还没有被真正的释放内存,finalize可能会暂时不执行!可是我用getRuntime方法显式的调用了垃圾收集程序可是还没能调用finalize方法吗?要想调用Test类中的或者是TestFinalize类中的finalize方法那应该怎么来做呢?谢谢!
      

  2.   

    finalize方法在对象被Garbage Collection被自动调用,但不确定总被调用!
    可以在main()方法最后加上System.runFinalizerOnExit(true);来强制执行!
      

  3.   

    现在的1.4.1正常情况基本能保证执行,当然,SUN确实是如上面的那样说不确定总被调用(主要是体现不要寄予太大希望,就像OnDestroy不确定一样:比如我一把叉掉windows窗体,肯定是来不及调用的)。finalize是用来进行系统的内存回收外的比如硬件、文件被占用的资源等的回收的。一个函数被确保执行是程序肯定在执行而且该函数肯定被系统或自己调用了。
    我在1.4.1中基本都能看到finalize被执行的结果(我输出的:))。
      

  4.   

    或许你可以这样
     protected void finalize() throws Throwable
           {
    //                 super.finalize();
                     System.out.println("We're in TestFinalize finalize block!");
           }
    或者这样
     protected void finalize() throws Throwable
           {
                     System.out.println("We're in TestFinalize finalize block!");
                     super.finalize();
           }你的代码我估计就是不能保证被调到的情况之一。:)
      

  5.   

    不过调用System.runFinalizersOnExit在java中是个不推荐使用的api,我觉得调用Runtime对象的runFinalization方法更好些!比如下面这样:
    Test t=new Test();
    t=null;
    Runtime rt=Runtime.getRuntime();
    rt.runFinalization();
    这样就能调用Test类中的finalize方法了,各位说这样对不对啊?
    调用finalize方法是不是可以这样认为:finalize方法除了在
    1.对象被Garbage Collection时自动调用
    2.程序退出时为每个对象调用一次finalize方法。
    3.向以上那样显试的调用finalize方法
    这三种方法以外,这个finalize方法不确定总是被调用的。这样理解对不对啊!如果是对的,我总算理解了这个finalize方法了!!!谢谢!立即给分哈!
      

  6.   

    本人的发表点拙见:
    finalize()确实是会在对象被收集为无用时被执行,但据我所知,在程序开始执行后,垃圾收集器并不是马上和程序同时启动,似乎要稍微有些延迟.比如,如果在程序中用循环的方式不停的产生空对象,垃圾回收器并不是在对象刚生成时就将其回收,不同的机器会有所不同,在我的机器上大概要到3000多个对象生成后才会开始回收.可能是你的程序太短,还没开始回收程序就结束了.
    我是在<Thingking in Java>这本书中看到的以上内容,具体内容记不清了.这本书可以在网上下载.网址如下:
    www.pcbookcn.com
    这本书里讲得很详细,还有原代码