问题:
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() throws Throwable
    {
        System.out.println("LivingCreature finalize");        if (DoBaseFinalization.flag)
            super.finalize();
    }
}class Animal extends LivingCreature
{
    Characteristic p= new Characteristic("has heart");
    Animal()
    {
        System.out.println("Animal finalize");
    }
    protected void finalize() throws Throwable{
      System.out.println("Animal finalize")
      if (DoBaseFinalization.flag)
             super.finalize();
    }
}class Amphibian extends Animal
{
    Characteristic p=new Characteristic("can live in water");
    Amphibian()
    {
        System.out.println("Amphibian");
    }    protected void finalize() throws Throwable
    {
        System.out.println("Amphibian finalize");
        if (DoBaseFinalization.flag)
            super.finalize();
    }
}public class Frog extends Amphibian
{
    Frog()
    {
        System.out.println("Frog()");
    }    protected void finalize() throws Throwable
    {
        System.out.println("Frog finalize");
        if (DoBaseFinalization.flag)
            super.finalize();
    }    public static void main(String[] args)
    {
        if (args.length !=0 && args[0].equals("finalize"))
           DoBaseFinalization.flag=true;
        else
           System.out.println("Not finalization bases");        new Frog();
        System.out.println("Bye!");
        System.gc();
    }
}
有一段这样的程序,然后输入
D:\j2sdk1.4.2_11>java Frog finalize
得到结果:
Creating Characteristicis alive
LivingCreature()
Creating Characteristichas heart
Animal finalize
Creating Characteristiccan live in water
Amphibian
Frog()
Bye!
Frog finalize
Amphibian finalize
Animal finalize
LivingCreature finalize
finalizing Characteristic is alive
finalizing Characteristic has heart
finalizing Characteristic can live in water我想问的是:为什么Creating Characteristicis alive在LivingCreature()前面显示,LivingCreature()是构造函数里面的内容阿
还有显示这三句是怎么回事?
finalizing Characteristic is alive
finalizing Characteristic has heart
finalizing Characteristic can live in water

解决方案 »

  1.   

    1。
    在构造LivingCreature实例的时候,实例变量先得到初始化。也就是:
     Characteristic p=new Characteristic("is alive");
    将先于LivingCreature的构造方法执行,因此会先打印出:Creating Characteristicis alive2。
    finalize() 方法相当于解构方法,当gc从内存中回收对象的内存时,该方法被执行。
    不太明白你的问题是?
      

  2.   

    楼上的你写的第一点我看懂了
    我的意思是说执行了finalize()方法后打印了一下几句
    Frog finalize
    Amphibian finalize
    Animal finalize
    LivingCreature finalize
    为什么还会打印下面3句呢
    finalizing Characteristic is alive
    finalizing Characteristic has heart
    finalizing Characteristic can live in water
      

  3.   

    finalize()方法是protected的,是不能从外部调用的。它是在执行gc时,由java容器自动调用的。finalize()方法一般用来释放该对象所占用的资源。
    gc: garbage collection, 垃圾回收,是指释放内存中不再被使用的对象。看main方法中的最后一句:
    System.gc();
    这时候就开始收集垃圾,因为刚刚构造的对象都不再有用,所有它们都在回收之列。容器就会调用这些对象的finalize()方法,所以就打出来:
    finalizing Characteristic is alive
    finalizing Characteristic has heart
    finalizing Characteristic can live in water