当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:17:00  来源:本站整理

<b>java承当和finalize()</b>[Java编程]

赞助商链接



  本文“<b>java承当和finalize()</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
通过“合成”办法成立新类时,永久没必要耽忧对那个类的成员对象的收尾工作.每个成员都是一个独立的对象,所以会得到正常的垃圾汇集以及收尾处理——无论它是不是不自己某个类一个成员.但在举行初始化的时刻,必须覆盖衍生类中的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++顶用于“破坏器”相同的情势,我们应当首先履行衍生类的收尾,再是底子类的收尾.这是由于衍生类的收尾大概调用底子类中相同的办法,要求底子类组件仍旧处于活动状况.因此,必须提早将它们排除(破坏).
  以上是“<b>java承当和finalize()</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .