0
点赞
收藏
分享

微信扫一扫

《Java编程思想第四版》学习笔记14

棒锤_45f2 2023-08-17 阅读 13

//: Frog.java
// Testing finalize with inheritance
class DoBaseFinalization {
    public static boolean flag = false;
}
class Characteristic {
    String s;
    Characteristic(String c) {
        s = c;
        out.println(
                "Creating Characteristic " + s);
    }
    protected void finalize() {
        out.println(
                "finalizing Characteristic " + s);
    }
}
class LivingCreature {
    Characteristic p =
            new Characteristic("is alive");
    LivingCreature() {
        out.println("LivingCreature()");
    }
    protected void finalize() {
        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() {
        out.println("Animal()");
    }
    protected void finalize() {
        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() {
        out.println("Amphibian()");
    }
    protected void finalize() {
        out.println("Amphibian finalize");
        if(DoBaseFinalization.flag)
            try {
                super.finalize();
            } catch(Throwable t) {}
    }
}
public class Frog extends Amphibian {
    Frog() {
        out.println("Frog()");
    }
    protected void finalize() {
        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
            out.println("not finalizing bases");
        new Frog(); // Instantly becomes garbage
        out.println("bye!");
// Must do this to guarantee that all
// finalizers will be called:
        System.runFinalizersOnExit(true);
    }
} ///:~

                                                                                                                                                       P.201-202

将该例程的最后一句System.runFinalizersOnExit(true)改为System.gc()。在IntelliJ IDEA 2023.1.4 (Ultimate Edition),Java版本 "18.0.2" 2022-07-19环境下运行结果分别为:

not finalizing bases

Creating Characteristic is alive

LivingCreature()

Creating Characteristic has heart

Animal()

Creating Characteristic can live in water

Amphibian()

Frog()

bye!

Frog finalize

finalizing Characteristic can live in water

finalizing Characteristic has heart

finalizing Characteristic is alive

Creating Characteristic is alive

LivingCreature()

Creating Characteristic has heart

Animal()

Creating Characteristic can live in water

Amphibian()

Frog()

bye!

Frog finalize

Amphibian finalize

Animal finalize

LivingCreature finalize

finalizing Characteristic can live in water

finalizing Characteristic has heart

finalizing Characteristic is alive

注意看Characteristic类的析构顺序和书上给出的输出结果相反,更具合理性,可能跟Java版本高了后技术改进有关。

举报

相关推荐

0 条评论