//: 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版本高了后技术改进有关。
标签:Java,14,finalize,Characteristic,Frog,finalizing,第四版,println,out From: https://blog.51cto.com/u_16183536/7125995