java之finalize在继承关系中的使用

转载请注明出处

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后,虚拟机检查到一个未引用的空间就会开始释放流程。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值