编写具有finalize( )方法的类,并在方法中打印相关信息.在main( )中为该类创建一个对象,试解释这个程序的行为.

解决方案 »

  1.   

    自己刚才写的程序如下,简单解释请看注释.
    public class GcTest { private String name;
    public GcTest(String name){
    this.name=name;
    System.out.println(name+  "建立");
    }
    //对象回收前执行
    protected void finalize(){
    System.out.println(name+  "被回收");
    }
    public static void main(String[] args){
    GcTest obj1=new GcTest("对象一");
    GcTest obj2=new GcTest("对象二");
    GcTest obj3=new GcTest("对象三");
    obj1=null;//标识对象为null
    obj2=null;
    obj3=null;
    System.gc();
    while(true);//不断执行程序,以让垃圾收集在程序结束前有机会执行
    }
    }
    这是一个涉及java垃圾回收和finalize()的小程序.在java中,我们可以使用system.gc()建议程序进行垃圾收集,如果建议被采纳,则对象资源会被回收,回收前会执行finalize()方法.
    请注意:
    在一般的程序里,finalize()真正被执行的时间是不知道的.不相当c++里的析构函数!
      

  2.   

    finalize()不被建议使用,因为
    1、finalize()的执行时间不确定,具体根据不同版本的JVM和不同垃圾回收策略有关
    2、finalize()中抛出的任何异常都将被忽略Effective JAVA 中介绍finalize()的作用有两个
    1、作为释放资源的安全网,在JDK,OutputStream等流中,如果使用者万一忘了关闭流,finalize()还可以最终得到一次关闭的机会(注意,不要指望靠它关,它只能作为一种备用策略)。
    2、JNI调用的外部资源,在JAVA里没有直接关闭的代码,写在finalize()中。子类一旦复写了finalize(),必须super.finalize(),否则父类的finalize()不执行。根据楼主的描述,我觉得不会有什么反应。
      

  3.   

    补充2楼1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
    2.程序退出时为每个对象调用一次finalize方法。
    3.显式的调用finalize方法除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因.
      

  4.   

    java垃圾回收都是自动在一定时间运行的,有可能是程序运行的间隙,也有可能是程序运行结束后,这个时间确实不能确定,所以java才会有垃圾自动回收机制