finalize方法的使用
finalize()是在java.lang.Object里定義的,也就是說每一個對象都有這么個方法。這個方法在gc啟動,該對象被回收的時候被調(diào)用。其實gc可以回收大部分的對象(凡是new出來的對象,gc都能搞定,一般情況下我們又不會用new以外的方式去創(chuàng)建對象),所以一般是不需要程序員去實現(xiàn)finalize的。
特殊情況下,需要程序員實現(xiàn)finalize,當(dāng)對象被回收的時候釋放一些資源,比如:一個socket鏈接,在對象初始化時創(chuàng)建,整個生命周期內(nèi)有效,那么就需要實現(xiàn)finalize,關(guān)閉這個鏈接。
使用finalize還需要注意一個事,調(diào)用super.finalize();
一個對象的finalize()方法只會被調(diào)用一次,而且finalize()被調(diào)用不意味著gc會立即回收該對象,所以有可能調(diào)用finalize()后,該對象又不需要被回收了,然后到了真正要被回收的時候,因為前面調(diào)用過一次,所以不會調(diào)用finalize(),產(chǎn)生問題。
所以,推薦不要使用finalize()方法,它跟析構(gòu)函數(shù)不一樣。
1.object定義protected void finalize()//定義為子類可見
2.執(zhí)行時機不可預(yù)知
當(dāng)一個對象變得不可觸及時,垃圾回收器某個時期會回收此對象。
當(dāng)回收對象之前會調(diào)用finalize方法,這類似于人類臨終之前必須做一件事情:寫遺言。
因為GC是不確定性的(這跟JVM相關(guān)),所以finalize方法的執(zhí)行具有不可預(yù)知性。
3.finalize忽略異常
即finalize代碼中若出現(xiàn)異常,異常會被忽略
4.finalize使用
什么時候使用?一般來說,finalize被作為第二種安全網(wǎng)來使用,如FileInputStream類,
當(dāng)對象回收時,有可能資源為釋放,所以這里第二次來確認(那也總比不釋放強吧,雖然具體釋放時機未定)
protected void finalize() throws IOException {
if (fd != null) {
if (fd != fd.in) {
close();
}
}
}
注意:某些用到finalize的地方,你必須像如下所示,顯式調(diào)用回收鏈。
protected void finalize() throws IOException {
try{
...
}finally{
super.finalize();
}
}
5.<effective java>建議:盡量不要使用finalize,除非以它作為安全網(wǎng),或是為了終結(jié)非關(guān)鍵的原生資源。
總結(jié)起來finalize()方法可以這樣記憶:
Object類定義;執(zhí)行不可預(yù)知,忽略異常,一般做第二安全網(wǎng)
參考地址:http://caizi0413.iteye.com/blog/845727
https://segmentfault.com/q/1010000000094660
總結(jié)
以上是生活随笔為你收集整理的finalize方法的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 八个常用的AS3开源类库
- 下一篇: 将手机中的文件传到电脑如何将手机备份到电