对象的销毁顺序好像不是100%和初始化相反,书好像有笔误;或者是Java版本问题吧。
代码如下:class DoBaseFinalization {
  public static boolean flag = false;
}class Characteristic {
  String s;
  Characteristic(String c) {
    s = c;
    System.out.println(
      "Creating Characteristic " + s);
  }
  protected void finalize() {
    System.out.println(
      "finalizing Characteristic " + s);
  }
}class LivingCreature {
  Characteristic p = 
    new Characteristic("is alive");
  LivingCreature() {
    System.out.println("LivingCreature()");
  }
  protected void finalize() {
    System.out.println(
      "LivingCreature finalize");
    // Call base-class version LAST!
    if(DoBaseFinalization.flag)
      try {
        super.finalize();
      } catch(Throwable t) {}
  }
}class Animal extends LivingCreature {
  Characteristic p = 
    new Characteristic("has heart");
  Animal() {
    System.out.println("Animal()");
  }
  protected void finalize() {
    System.out.println("Animal finalize");
    if(DoBaseFinalization.flag)
      try {
        super.finalize();
      } catch(Throwable t) {}
  }
}class Amphibian extends Animal {
  Characteristic p = 
    new Characteristic("can live in water");
  Amphibian() {
    System.out.println("Amphibian()");
  }
  protected void finalize() {
    System.out.println("Amphibian finalize");
    if(DoBaseFinalization.flag)
      try {
        super.finalize();
      } catch(Throwable t) {}
  }
}public class Frog extends Amphibian {
  Frog() {
    System.out.println("Frog()");
  }
  protected void finalize() {
    System.out.println("Frog finalize");
    if(DoBaseFinalization.flag)
      try {
        super.finalize();
      } catch(Throwable t) {}
  }
  public static void main(String[] args) {
    if(args.length != 0 && 
       args[0].equals("finalize"))
       DoBaseFinalization.flag = true;
    else
      System.out.println("not finalizing bases");
    new Frog(); // Instantly becomes garbage
    System.out.println("bye!");
    // Must do this to guarantee that all 
    // finalizers will be called:
    System.runFinalizersOnExit(true);
  }

解决方案 »

  1.   

    对象的销毁是JVM的事吧,何时销毁取决于JVM 程序员无法控制。
    finalize() 是程序员用来建议JVM销毁某个对象,至于销不销毁还是要看JVM心情如何啦
      

  2.   

    是你没分清楚概念首先,java垃圾回收跟finalize调用是两码事,java虚拟机只保证finalize在对象被垃圾回收之前最多调用一次,意思就是java虚拟机根本不保证finalize调用的顺序就是对象被垃圾回收的顺序,也就是说你上面测试的代码是毫无根据的!事实上,jvm规范中有说:垃圾收集器可以用任意顺序调用finalize方法,任意线程,甚至多线程!至于垃圾收集器是否可以以任意顺序收集垃圾对象,在jvm相关资料上本人目前还没看到类似字眼,如有看到的也跟我说下哇
      

  3.   

    当是局部变量时,java对象的引用放到一个叫“栈帧”中的局部变量区,然后将这个栈帧压入java栈,当方法返回或者异常时,这个栈帧弹出java栈并被抛弃当是类的属性时,这些对象的引用是存放在常量池中,常量池有一个叫constant_class_info表,这个表指向constant_utf8_info表,在类初始化的时候,constant_utf8_info中存的就是类、接口、方法、字段等的字符串表示,在运行的时候解析这些字符串并替换成真正的引用