熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

繼承和finalize()

2013-11-23 19:31:07  來源: Java核心技術 

  通過合成方法創建新類時永遠不必擔心對那個類的成員對象的收尾工作每個成員都是一個獨立的對象所以會得到正常的垃圾收集以及收尾處理——無論它是不是不自己某個類一個成員但在進行初始化的時候必須覆蓋衍生類中的finalize()方法——如果已經設計了某個特殊的清除進程要求它必須作為垃圾收集的一部分進行覆蓋衍生類的finalize()時務必記住調用finalize()的基礎類版本否則基礎類的初始化根本不會發生下面這個例子便是明證
  
  //: Frogjava
  // Testing finalize with inheritance
  
  class DoBaseFinalization {
   public static boolean flag = false;
  }
  
  class Characteristic {
   String s;
   Characteristic(String c) {
    s = c;
    Systemoutprintln(
     Creating Characteristic + s);
   }
   protected void finalize() {
    Systemoutprintln(
     finalizing Characteristic + s);
   }
  }
  
  class LivingCreature {
   Characteristic p =
    new Characteristic(is alive);
   LivingCreature() {
    Systemoutprintln(LivingCreature());
   }
   protected void finalize() {
    Systemoutprintln(
     LivingCreature finalize);
    // Call baseclass version LAST!
    if(DoBaseFinalizationflag)
     try {
      superfinalize();
     } catch(Throwable t) {}
   }
  }
  
  class Animal extends LivingCreature {
   Characteristic p =
    new Characteristic(has heart);
   Animal() {
    Systemoutprintln(Animal());
   }
   protected void finalize() {
    Systemoutprintln(Animal finalize);
    if(DoBaseFinalizationflag)
     try {
      superfinalize();
     } catch(Throwable t) {}
   }
  }
  
  class Amphibian extends Animal {
   Characteristic p =
    new Characteristic(can live in water);
   Amphibian() {
    Systemoutprintln(Amphibian());
   }
   protected void finalize() {
    Systemoutprintln(Amphibian finalize);
    if(DoBaseFinalizationflag)
     try {
      superfinalize();
     } catch(Throwable t) {}
   }
  }
  
  public class Frog extends Amphibian {
   Frog() {
    Systemoutprintln(Frog());
   }
   protected void finalize() {
    Systemoutprintln(Frog finalize);
    if(DoBaseFinalizationflag)
     try {
      superfinalize();
     } catch(Throwable t) {}
   }
   public static void main(String[] args) {
    if(argslength != &&
      args[]equals(finalize))
      DoBaseFinalizationflag = true;
    else
     Systemoutprintln(not finalizing bases);
    new Frog(); // Instantly becomes garbage
    Systemoutprintln(bye!);
    // Must do this to guarantee that all
    // finalizers will be called:
    SystemrunFinalizersOnExit(true);
   }
  } ///:~
  
  DoBasefinalization類只是簡單地容納了一個標志向分級結構中的每個類指出是否應調用superfinalize()這個標志的設置建立在命令行參數的基礎上所以能夠在進行和不進行基礎類收尾工作的前提下查看行為
  
  分級結構中的每個類也包含了Characteristic類的一個成員對象大家可以看到無論是否調用了基礎類收尾模塊Characteristic成員對象都肯定會得到收尾(清除)處理
  
  每個被覆蓋的finalize()至少要擁有對protected成員的訪問權力因為Object類中的finalize()方法具有protected屬性而編譯器不允許我們在繼承過程中消除訪問權限(友好的受到保護的具有更小的訪問權限)
  
  在Frogmain()中DoBaseFinalization標志會得到配置而且會創建單獨一個Frog對象請記住垃圾收集(特別是收尾工作)可能不會針對任何特定的對象發生所以為了強制采取這一行動SystemrunFinalizersOnExit(true)添加了額外的開銷以保證收尾工作的正常進行若沒有基礎類初始化則輸出結果是
  
  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 is alive
  finalizing Characteristic has heart
  finalizing Characteristic can live in water
  
  從中可以看出確實沒有為基礎類Frog調用收尾模塊但假如在命令行加入finalize自變量則會獲得下述結果
  
  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 is alive
  finalizing Characteristic has heart
  finalizing Characteristic can live in water
  
  盡管成員對象按照與它們創建時相同的順序進行收尾但從技術角度說並沒有指定對象收尾的順序但對於基礎類我們可對收尾的順序進行控制采用的最佳順序正是在這裡采用的順序它與初始化順序正好相反按照與C++中用於破壞器相同的形式我們應該首先執行衍生類的收尾再是基礎類的收尾這是由於衍生類的收尾可能調用基礎類中相同的方法要求基礎類組件仍然處於活動狀態因此必須提前將它們清除(破壞)

From:http://tw.wingwit.com/Article/program/Java/hx/201311/27016.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.