關(guān)于Java中finalize析構(gòu)方法的作用詳解
一. 析構(gòu)方法
1. 概念
我們現(xiàn)在已經(jīng)知道,構(gòu)造方法負(fù)責(zé)創(chuàng)建一個(gè)Java的類對(duì)象,并可以對(duì)該對(duì)象進(jìn)行初始化。與此相對(duì)應(yīng)的,其實(shí)還有一個(gè)方法,可以負(fù)責(zé)對(duì)象的銷毀,這個(gè)負(fù)責(zé)對(duì)象銷毀的方法,就叫做析構(gòu)方法。在Java中,有一個(gè)專門的析構(gòu)方法,即finalize()方法!
2. 作用
finalize()析構(gòu)方法負(fù)責(zé)回收J(rèn)ava對(duì)象所占用的內(nèi)存,該方法一般是在對(duì)象被垃圾收集器回收之前調(diào)用。通常我們會(huì)在finalize()方法中,指定對(duì)象銷毀時(shí)要執(zhí)行的操作,比如關(guān)閉對(duì)象打開的文件、IO流、釋放內(nèi)存資源等清理垃圾碎片的工作。
3. 特點(diǎn)
finalize()析構(gòu)方法具有以下這些特點(diǎn):
- 垃圾回收器是否會(huì)執(zhí)行finalize方法,以及何時(shí)執(zhí)行該方法,是不確定的;
- finalize()方法有可能會(huì)使對(duì)象復(fù)活,恢復(fù)到可觸及的狀態(tài);
- 垃圾回收器執(zhí)行finalize()方法時(shí),如果出現(xiàn)異常,垃圾回收器不會(huì)報(bào)告異常,程序會(huì)繼續(xù)正常運(yùn)行。
二. 基本使用
1. finalize簡(jiǎn)介
在大多數(shù)情況下,Java的內(nèi)存和垃圾回收都是由JVM的GC機(jī)制來自動(dòng)完成。如果我們想手動(dòng)實(shí)現(xiàn),就可以使用finalize()方法,但該方法的執(zhí)行與否是不確定的。也就是說,即使我們調(diào)用了finalize()方法,JVM也不一定就會(huì)立刻執(zhí)行垃圾回收操作,這個(gè)取決于當(dāng)前系統(tǒng)的內(nèi)存占用情況。
另外finalize()是一個(gè)被protected關(guān)鍵詞修飾的方法,可以確保該方法不會(huì)被該類以外的代碼調(diào)用。在每個(gè)Java類中都有finalize()方法,我們可以復(fù)寫當(dāng)前類中的finalize()方法。
@Override protected void finalize(){ // 在這里終結(jié)代碼 }
2. 代碼案例
接下來設(shè)計(jì)一個(gè)代碼案例,來給大家講講析構(gòu)方法的基本使用。
2.1 Counter計(jì)數(shù)器
我們先來定義一個(gè)Counter計(jì)數(shù)器類,設(shè)計(jì)一個(gè)靜態(tài)的計(jì)數(shù)器變量,通過方法調(diào)用改變count的值。
/** * @author 一一哥Sun */ public class Counter { private static int count = 0; // 計(jì)數(shù)器變量 public Counter() { // 構(gòu)造方法 this.count++; // 創(chuàng)建實(shí)例時(shí)增加值 } public int getCount() { // 獲取計(jì)數(shù)器的值 return this.count; } @Override protected void finalize() { // 析構(gòu)方法 this.count--; // 實(shí)例銷毀時(shí)減少值 System.out.println("對(duì)象銷毀"); } }
以上案例中,static、@override等關(guān)鍵字,有些同學(xué)可能還不明白是怎么回事!先別急,后面我們都會(huì)學(xué)到,這里請(qǐng)大家先照著代碼練習(xí)一下。
2.2 CounterTest測(cè)試類
接著我們?cè)賱?chuàng)建第2個(gè)類,對(duì)Counter里的finalize()進(jìn)行測(cè)試。
/* * @author * QQ:2312119590 * CSDN、掘金、知乎找我哦 */ public class CounterTest { public static void main(String[] args) { Counter cnt1 = new Counter(); // 創(chuàng)建第一個(gè)實(shí)例對(duì)象 System.out.println("數(shù)量:" + cnt1.getCount()); // 輸出1 Counter cnt2 = new Counter(); // 創(chuàng)建第二個(gè)實(shí)例對(duì)象 System.out.println("數(shù)量:" + cnt2.getCount()); // 輸出2 cnt2 = null; // 銷毀實(shí)例2 try { System.gc(); // 手動(dòng)調(diào)用清理內(nèi)存的gc()方法 Thread.currentThread().sleep(1000); // 延時(shí)1000毫秒 System.out.println("數(shù)量:" + cnt1.getCount()); //再次輸出1,說明有個(gè)對(duì)象被銷毀 } catch (InterruptedException e) { e.printStackTrace(); } } }
因?yàn)?strong>finalize()方法具有不確定性,也就是說,該方法到底會(huì)不會(huì)起作用是不一定的!所以我們?cè)诔绦蛑锌梢哉{(diào)用 System.gc()方法或者 Runtime.gc()方法,來顯式地提醒垃圾回收器盡快去執(zhí)行垃圾回收操作。最終執(zhí)行效果如下圖所示:
四. 結(jié)語
至此,就把析構(gòu)方法的功能及使用給大家介紹完畢了,現(xiàn)在你學(xué)會(huì)了嗎?對(duì)我們這些初學(xué)者來說,我們暫時(shí)知道finalize析構(gòu)方法的作用和基本用法即可。
以上就是關(guān)于Java中finalize析構(gòu)方法的作用詳解的詳細(xì)內(nèi)容,更多關(guān)于Java finalize析構(gòu)方法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Cloud Stream分區(qū)分組原理圖解
這篇文章主要介紹了Spring Cloud Stream的分區(qū)和分組,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03springboot中實(shí)現(xiàn)上傳文件的功能簡(jiǎn)單示例
這篇文章主要給大家介紹了關(guān)于springboot中實(shí)現(xiàn)上傳文件功能的相關(guān)資料,在Spring Boot中實(shí)現(xiàn)文件上傳下載功能相對(duì)簡(jiǎn)單,文中給出了代碼示例,需要的朋友可以參考下2023-09-09java代碼塊之簡(jiǎn)易qq登錄界面及按鈕顏色設(shè)置代碼
這篇文章主要介紹了java代碼塊之簡(jiǎn)易qq登錄界面及按鈕顏色設(shè)置代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11Java實(shí)現(xiàn)KFC點(diǎn)餐系統(tǒng)過程解析
這篇文章主要介紹了Java實(shí)現(xiàn)KFC點(diǎn)餐系統(tǒng)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10關(guān)于Controller層和Service層的類報(bào)錯(cuò)問題及解決方案
這篇文章主要介紹了關(guān)于Controller層和Service層的類報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02MyBatis insert操作插入數(shù)據(jù)之后返回插入記錄的id
今天小編就為大家分享一篇關(guān)于MyBatis插入數(shù)據(jù)之后返回插入記錄的id,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03基于Springboot+Junit+Mockito做單元測(cè)試的示例
本篇文章主要介紹了基于Springboot+Junit+Mockito做單元測(cè)試的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02