java之finalize在继承关系中的使用
2015-03-21 23:03
423 查看
转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/44524077
作者:小马
假设在基类BaseA中重载了finalize,如果继承类DerivedA中也要重载finalize,一定要先调用基类的版本,否则基类的finalize不会自动调用。
看一个代码示例:
不加参数直接运行的结果是
finalize参数控制一个标志位,决定是否调用基类的finalize
从运行结果上也证明了开篇讲到的结论。再补充一个知识点,注意到main函数中创建Frog实例的方法:
如下改成这样:
运行发现所有的类都不会调用finalize了。这是因为new Frog分配了实例空间后没有被任何变量引用,调用完System.gc后,虚拟机检查到一个未引用的空间就会开始释放流程。
http://blog.csdn.net/pony_maggie/article/details/44524077
作者:小马
假设在基类BaseA中重载了finalize,如果继承类DerivedA中也要重载finalize,一定要先调用基类的版本,否则基类的finalize不会自动调用。
看一个代码示例:
class DoBaseFinalization { public static boolean flag = false; } class Characteristic { String s; Characteristic(String c) { s = c; System.out.println("Creating characteritic " + 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() throws Throwable { System.out.println("LivingCreature finalizing"); if(DoBaseFinalization.flag) super.finalize(); } } class Animal extends LivingCreature { Characteristic p = new Characteristic("has heart"); Animal() { System.out.println("Animal()"); } protected void finalize() throws Throwable { System.out.println("Animal finalizing"); if(DoBaseFinalization.flag) super.finalize(); } } class Amphibian extends Animal { Characteristic p = new Characteristic("can live in water"); Amphibian() { System.out.println("Amphibian()"); } protected void finalize() throws Throwable { System.out.println("Amphibian finalizing"); if(DoBaseFinalization.flag) super.finalize(); } } public class Frog extends Amphibian { Frog() { System.out.println("Frog()"); } protected void finalize() throws Throwable { System.out.println("Frog finalizing"); if(DoBaseFinalization.flag) super.finalize(); } /** * @param args */ 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(); System.out.println("Bye"); System.gc(); } }
不加参数直接运行的结果是
not finalizing bases Creating characteritic is alive LivingCreature() Creating characteritic has heart Animal() Creating characteritic can live in water Amphibian() Frog() Bye finalizing characteristic can live in water finalizing characteristic has heart finalizing characteristic is alive Frog finalizing
</pre>加上finalize参数之后的运行结果<p></p><p></p><pre code_snippet_id="624937" snippet_file_name="blog_20150321_4_804209" name="code" class="html">Creating characteritic is alive LivingCreature() Creating characteritic has heart Animal() Creating characteritic can live in water Amphibian() Frog() Bye finalizing characteristic can live in water finalizing characteristic has heart finalizing characteristic is alive Frog finalizing Amphibian finalizing Animal finalizing LivingCreature finalizing
finalize参数控制一个标志位,决定是否调用基类的finalize
protected void finalize() throws Throwable { System.out.println("Frog finalizing"); if(DoBaseFinalization.flag) super.finalize(); }
从运行结果上也证明了开篇讲到的结论。再补充一个知识点,注意到main函数中创建Frog实例的方法:
new Frog(); System.out.println("Bye"); System.gc();
如下改成这样:
Frog a = new Frog(); System.out.println("Bye"); System.gc();
运行发现所有的类都不会调用finalize了。这是因为new Frog分配了实例空间后没有被任何变量引用,调用完System.gc后,虚拟机检查到一个未引用的空间就会开始释放流程。
相关文章推荐
- Java IO流类继承关系及使用说明
- 【Java基础知识】继承体系中的成员关系,this,super关键字的使用,数据初始化
- java 中继承关系中的super的使用
- Java继承关系中,父类方法使用实例变量和调用实例方法的探究
- Java 使用泛型 泛型之间继承关系
- Java IO流类继承关系及使用说明
- 在CMD窗口中使用javac和java命令进行编译和执行带有包名的具有继承关系的类
- Java IO流类继承关系及使用说明
- java单例类继承问题--使用登记式单例的发现
- Java中使用接口实现多继承和多态的方法
- StructLayout在继承关系中的使用
- java finalize方法的使用
- 为什么JAVA要使用单继承体系
- 使用Spring来实现任务计划服务一:继承java.util.TimerTask
- 使用 ASM 实现 Java 语言的“多重继承”
- 使用Spring来实现任务计划服务二:不继承java.util.TimerTask
- Java finalize方法使用
- Java与C++区别之继承关系中的函数
- 使用Java继承与泛型特性创建高效与安全的DAO对象
- Java继承关系、构造器的内存分析