展望2011

2007-01-04 | java中finalize的使用(1)[转]

上一篇 / 下一篇  2007-04-27 17:55:12 / 个人分类:编程基础

%D#b~@+[H$}F/N8w0JAVA编程思想》:51Testing软件测试网R'R!QH:PBPJz

4Kx:J$?6UO0java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()

*b;sG0y+T a4u]051Testing软件测试网/Pr[Nf R R%Y

          (1).对象不一定会被回收。51Testing软件测试网\5c/a,dQ/`!G zz

51Testing软件测试网_.\-AHL pF`6j

       (2).垃圾回收不是析构函数。

{Wxh]w051Testing软件测试网*|-f2t$]{ mFE

       (3).垃圾回收只与内存有关。

Z!Czr.Y1@/xg's051Testing软件测试网`/zrlz&@d I

       (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。51Testing软件测试网_hg|8@d I^$cT&s2mJ

~)K`!F6g8},g:E0有时当撤消一个对象时,需要完成一些操作。例如,如果一个对象正在处理的是非Java 资源,如文件句柄或window 字符字体,这时你要确认在一个对象被撤消以前要保证这些资源被释放。为处理这样的状况,Java 提供了被称为收尾(finalization )的机制。使用该机制你可以定义一些特殊的操作,这些操作在一个对象将要被垃圾回收程序释放时执行。51Testing软件测试网"D3x4Y4w,w

51Testing软件测试网e @.|e3N6RL0lI

要给一个类增加收尾(finalizer ),你只要定义finalize ( ) 方法即可。Java 回收该类的一个对象时,就会调用这个方法。在finalize ( )方法中,你要指定在一个对象被撤消前必须执行的操作。垃圾回收周期性地运行,检查对象不再被运行状态引用或间接地通过其他对象引用。就在对象被释放之前,Java 运行系统调用该对象的finalize( ) 方法。

2G1R pK(Py Y5B051Testing软件测试网$yyw(d3y"b#Mt F!l

finalize()方法的通用格式如下:51Testing软件测试网:a,Y(X8AV"ak0C!V

'u[Zy5[Y*WQ(C0protected void finalize( )
E/J'n!u cm0{
XE!M~;B0// finalization code here
O+P ?_`&R {;D$z ^ V0}
+n5Ij/{-BjIc4`0
51Testing软件测试网.|#[$A4MPy/d

51Testing软件测试网+|,Fq$S f~

其中,关键字protected是防止在该类之外定义的代码访问finalize()标识符。该标识符和其他标识符将在第7章中解释。

D7r:^F&r"lq(ZL051Testing软件测试网 p8i1w)MAX

理解finalize( ) 正好在垃圾回收以前被调用非常重要。例如当一个对象超出了它的作用域时,finalize( ) 并不被调用。这意味着你不可能知道何时——甚至是否——finalize( ) 被调用。因此,你的程序应该提供其他的方法来释放由对象使用的系统资源,而不能依靠finalize( ) 来完成程序的正常操作。

3`![oy,\2Q;Td0

e'|7e)QV;dQN0注意:如果你熟悉C ,那你知道C 允许你为一个类定义一个撤消函数(destructor ),它在对象正好出作用域之前被调用。Java不支持这个想法也不提供撤消函数。finalize() 方法只和撤消函数的功能接近。当你对Java 有丰富经验时,你将看到因为Java使用垃圾回收子系统,几乎没有必要使用撤消函数。

~7Xf$qi1`T"t0

TAG: JAVA finalize 编程基础

我测故我在 引用 删除 caicai1724   /   2007-04-27 17:55:47
补充知识点:
JVM是Java virtual machine的所写,中文是JAVA虚拟机的意思,可以理解为就是JAVA程序在每个平台上运行所需要的解释器。
 

评分:0

我来说两句

Open Toolbar