您的位置:jsp学习站首页 >> JAVA类 >> JAVA高级 >> 继承和finalize()

继承和finalize() (1)

[ 来源:互网络 | 更新日期:2007-09-08 12:36:02 | 浏览次数:19893]
简介:java// Testing finalize with inheritanceclass DoBaseFinalization { public static boolean flag = false;}class Characteristic { String s; Characteristic(String c) {  s = c;  System
通过“合成”方法创建新类时,永远不必担心对那个类的成员对象的收尾工作。每个成员都是一个独立的对象,所以会得到正常的垃圾收集以及收尾处理――无论它是不是不自己某个类一个成员。但在进行初始化的时候,必须覆盖衍生类中的finalize()方法――如果已经设计了某个特殊的清除进程,要求它必须作为垃圾收集的一部分进行。覆盖衍生类的finalize()时,务必记住调用finalize()的基础类版本。否则,基础类的初始化根本不会发生。下面这个例子便是明证:

//: Frog.java
// Testing finalize with inheritance

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);
 }
} ///:~

DoBasefinalization类只是简单地容纳了一个标志,向分级结构中的每个类指出是否应调用super.finalize()。这个标志的设置建立在命令行参数的基础上,所以能够在进行和不进行基础类收尾工作的前提下查看行为。

[1] [2]
Tags:关键字:继承和finalize()
责任编辑:glen