日期: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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论