Code Analysis(1)--finalize()方法
Create a class called Tank that can be filled and emptied, and has a termination condition that it must be empty when the object is cleaned up.Write a finalize() that verifies this termination condition. In main(), test the possible scenarios that can occur whtn your Tank is used.
// initialization/TankTest.java
// TIJ4 Chapter Initialization, Exercise 12, page 177
class Tank {
int howFull = 0;
Tank() { this(0); }
Tank(int fullness) {
howFull = fullness;
}
void sayHowFull() {
if(howFull == 0)
System.out.println("Tank is empty");
else
System.out.println("Tank filling status = " + howFull);
}
void empty() {
howFull = 0;
}
protected void finalize() {
if(howFull != 0)
System.out.println("Error: Tank not empty! Its name is " + this);
// Normally, you'll also do this:
// super.finalize(); // Call the base-class version
}
}
public class TankTest {
public static void main(String[] args) {
Tank tank1 = new Tank();
Tank tank2 = new Tank(3);
Tank tank3 = new Tank(5);
// Proper cleanup: empty tank before going home
tank2.empty();
// Drop the reference, forget to cleanup:
new Tank(6);
System.out.println("Check tanks:");
System.out.println("tank1: " + tank1);
tank1.sayHowFull();
System.out.println("tank2: " + tank2);
tank2.sayHowFull();
System.out.println("tank3: " + tank3);
tank3.sayHowFull();
System.out.println("first forced gc():");
System.gc();
// Force finalization on exit but using method
// deprecated since JDK 1.1:
System.out.println("try deprecated runFinalizersOnExit(true):");
System.runFinalizersOnExit(true);
System.out.println("last forced gc():");
System.gc();
}
}/* Output:
Check tanks:
tank1: Tank@c17164
Tank is empty
tank2: Tank@1fb8ee3
Tank is empty
tank3: Tank@61de33
Tank filling status = 5
first forced gc():
Error: Tank not empty! Tank's name is Tank@ca0b6
try deprecated runFinalizersOnExit(true):
last forced gc():
Error: Tank not empty! Tank's name is Tank@61de33
*///:~
由以上例子可知:在第一次强制垃圾回收时,new Tank(6)产生对象所占用的存储空间无法回收,在使用runFinalizersOnExit(true)方法(已过时,不安全)后new Tank(6)产生对象所占用的存储空间已被回收,但是由于tank3对象不满足回收“终结条件”而未被回收。
上面的解释似乎有点问题,请高手指正!
浙公网安备 33010602011771号