您的位置:首页 > 编程语言 > Java开发

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

2015-03-21 23:03 423 查看
转载请注明出处
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后,虚拟机检查到一个未引用的空间就会开始释放流程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: