Java中没有C++中析构函数(对象被销毁时自动被调用的函数)的概念,因为Java中对象的清理是由垃圾回收机来完成的.许多情况下,我们仅需垃圾回收机来完成清理就足够了.垃圾回收机可能永远不会被调用,即使被调用,它也可能以任何它想要的顺序来回收对象.最好的建议是,除了内存(资源)以外,不要依赖垃圾回收机来做任何事情.对于其他需要清理的资源(如数据库连接等),你还是要写自己的清理方法.清理的顺序与初始化的顺序恰好相反.
Thinking in Java 4中给出了计算机辅助设计(CAD)的一例,代码片段如下(仅说明原理,不可执行):
注意两个地方:一个是dispose方法里清理的顺序完全和初始化的顺序相反;另一个是finally子句保证c.dispose()语句在任何情况下都可执行.
Thinking in Java 4中给出了计算机辅助设计(CAD)的一例,代码片段如下(仅说明原理,不可执行):
public
class
Clear
extends
Shape
{
private Circle c;
private Triangle t;
private Line[] lines = new Line[3];
/**
* Contructor
* @param i
*/
public Clear(int i)
{
super(i+1);
for(int j=0;j<lines.length;j++)
{
lines[i] = new Line(j,j*j);
c = new Circle(1);
t = new Triangle(1);
System.out.println("Combined Constructor!");
}
}
/**
* 清理的方法
*/
public void dispose()
{
System.out.println("CADSystem Dispose!");
//the order of cleanup is the reverse of the order of initialization
//清理的顺序与初始化的顺序相反
t.dispose();
c.dispose();
for(int i=lines.length;i>=0;i--)
{
lines[i].dispose();
}
super.dispose();
}
/**
* 主方法
*/
public static void main(String[] args)
{
Clear c = new Clear(1);
try
{
// do(c)
}finally
{
//try and finally can make sure c.dispose must be invoked
c.dispose();
}
}
}
{
private Circle c;
private Triangle t;
private Line[] lines = new Line[3];
/**
* Contructor
* @param i
*/
public Clear(int i)
{
super(i+1);
for(int j=0;j<lines.length;j++)
{
lines[i] = new Line(j,j*j);
c = new Circle(1);
t = new Triangle(1);
System.out.println("Combined Constructor!");
}
}
/**
* 清理的方法
*/
public void dispose()
{
System.out.println("CADSystem Dispose!");
//the order of cleanup is the reverse of the order of initialization
//清理的顺序与初始化的顺序相反
t.dispose();
c.dispose();
for(int i=lines.length;i>=0;i--)
{
lines[i].dispose();
}
super.dispose();
}
/**
* 主方法
*/
public static void main(String[] args)
{
Clear c = new Clear(1);
try
{
// do(c)
}finally
{
//try and finally can make sure c.dispose must be invoked
c.dispose();
}
}
}