国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

繼承和finalize()

2019-11-18 12:08:33
字體:
來源:轉載
供稿:網友

  通過“合成”方法創建新類時,永遠不必擔心對那個類的成員對象的收尾工作。每個成員都是一個獨立的對象,所以會得到正常的垃圾收集以及收尾處理——無論它是不是不自己某個類一個成員。但在進行初始化的時候,必須覆蓋衍生類中的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()。這個標志的設置建立在命令行參數的基礎上,所以能夠在進行和不進行基礎類收尾工作的前提下查看行為。
  
  分級結構中的每個類也包含了Characteristic類的一個成員對象。大家可以看到,無論是否調用了基礎類收尾模塊,Characteristic成員對象都肯定會得到收尾(清除)處理。
  
  每個被覆蓋的finalize()至少要擁有對protected成員的訪問權力,因為Object類中的finalize()方法具有protected屬性,而編譯器不答應我們在繼續過程中消除訪問權限(“友好的”比“受到保護的”具有更小的訪問權限)。
  
  在Frog.main()中,DoBaseFinalization標志會得到配置,而且會創建單獨一個Frog對象。請記住垃圾收集(非凡是收尾工作)可能不會針對任何特定的對象發生,所以為了強制采取這一行動,System.runFinalizersOnExit(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++中用于“破壞器”相同的形式,我們應該首先執行衍生類的收尾,再是基礎類的收尾。這是由于衍生類的收尾可能調用基礎類中相同的方法,要求基礎類組件仍然處于活動狀態。因此,必須提前將它們清除(破壞)。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 无锡市| 鄄城县| 沽源县| 泰顺县| 玉环县| 淄博市| 河西区| 宣威市| 林口县| 昌吉市| 绩溪县| 渭源县| 大港区| 孟津县| 大竹县| 湘乡市| 远安县| 伊川县| 东乡县| 鱼台县| 峨眉山市| 浑源县| 阿城市| 永昌县| 北流市| 凤山市| 邵阳市| 泾源县| 平舆县| 淳安县| 巴南区| 富民县| 苏尼特右旗| 湖南省| 会理县| 池州市| 昌都县| 辽宁省| 资兴市| 玉门市| 富裕县|