關(guān)于Java中finalize析構(gòu)方法的作用詳解
一. 析構(gòu)方法
1. 概念
我們現(xiàn)在已經(jīng)知道,構(gòu)造方法負(fù)責(zé)創(chuàng)建一個(gè)Java的類(lèi)對(duì)象,并可以對(duì)該對(duì)象進(jìn)行初始化。與此相對(duì)應(yīng)的,其實(shí)還有一個(gè)方法,可以負(fù)責(zé)對(duì)象的銷(xiāo)毀,這個(gè)負(fù)責(zé)對(duì)象銷(xiāo)毀的方法,就叫做析構(gòu)方法。在Java中,有一個(gè)專(zhuān)門(mén)的析構(gòu)方法,即finalize()方法!
2. 作用
finalize()析構(gòu)方法負(fù)責(zé)回收J(rèn)ava對(duì)象所占用的內(nèi)存,該方法一般是在對(duì)象被垃圾收集器回收之前調(diào)用。通常我們會(huì)在finalize()方法中,指定對(duì)象銷(xiāo)毀時(shí)要執(zhí)行的操作,比如關(guān)閉對(duì)象打開(kāi)的文件、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ī)制來(lái)自動(dòng)完成。如果我們想手動(dòng)實(shí)現(xiàn),就可以使用finalize()方法,但該方法的執(zhí)行與否是不確定的。也就是說(shuō),即使我們調(diào)用了finalize()方法,JVM也不一定就會(huì)立刻執(zhí)行垃圾回收操作,這個(gè)取決于當(dāng)前系統(tǒng)的內(nèi)存占用情況。
另外finalize()是一個(gè)被protected關(guān)鍵詞修飾的方法,可以確保該方法不會(huì)被該類(lèi)以外的代碼調(diào)用。在每個(gè)Java類(lèi)中都有finalize()方法,我們可以復(fù)寫(xiě)當(dāng)前類(lèi)中的finalize()方法。
@Override
protected void finalize(){
// 在這里終結(jié)代碼
}2. 代碼案例
接下來(lái)設(shè)計(jì)一個(gè)代碼案例,來(lái)給大家講講析構(gòu)方法的基本使用。
2.1 Counter計(jì)數(shù)器
我們先來(lái)定義一個(gè)Counter計(jì)數(shù)器類(lèi),設(shè)計(jì)一個(gè)靜態(tài)的計(jì)數(shù)器變量,通過(guò)方法調(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í)例銷(xiāo)毀時(shí)減少值
System.out.println("對(duì)象銷(xiāo)毀");
}
}以上案例中,static、@override等關(guān)鍵字,有些同學(xué)可能還不明白是怎么回事!先別急,后面我們都會(huì)學(xué)到,這里請(qǐng)大家先照著代碼練習(xí)一下。
2.2 CounterTest測(cè)試類(lèi)
接著我們?cè)賱?chuàng)建第2個(gè)類(lèi),對(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; // 銷(xiāo)毀實(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,說(shuō)明有個(gè)對(duì)象被銷(xiāo)毀
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}因?yàn)?strong>finalize()方法具有不確定性,也就是說(shuō),該方法到底會(huì)不會(huì)起作用是不一定的!所以我們?cè)诔绦蛑锌梢哉{(diào)用 System.gc()方法或者 Runtime.gc()方法,來(lái)顯式地提醒垃圾回收器盡快去執(zhí)行垃圾回收操作。最終執(zhí)行效果如下圖所示:

四. 結(jié)語(yǔ)
至此,就把析構(gòu)方法的功能及使用給大家介紹完畢了,現(xiàn)在你學(xué)會(huì)了嗎?對(duì)我們這些初學(xué)者來(lái)說(shuō),我們暫時(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)文章
配置hadoop環(huán)境mapreduce連接不上hdfs解決
這篇文章主要為大家介紹了配置hadoop環(huán)境mapreduce連接不上hdfs解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10
java String類(lèi)常量池分析及"equals"和"==”區(qū)別詳細(xì)介紹
這篇文章主要介紹了java String類(lèi)常量池分析及"equals"和"==”區(qū)別詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下2016-12-12
解決微服務(wù)下Mybatis?xml無(wú)效綁定問(wèn)題及分析Invalid?bound?statement
這篇文章主要介紹了解決微服務(wù)下Mybatis?xml無(wú)效綁定問(wèn)題及分析Invalid?bound?statement,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
IntelliJ IDEA創(chuàng)建普通的Java 項(xiàng)目及創(chuàng)建 Java 文件并運(yùn)行的教程
這篇文章主要介紹了IntelliJ IDEA創(chuàng)建普通的Java 項(xiàng)目及創(chuàng)建 Java 文件并運(yùn)行的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Spring循環(huán)依賴(lài)實(shí)現(xiàn)過(guò)程揭秘
這篇文章主要介紹了Spring循環(huán)依賴(lài)實(shí)現(xiàn)過(guò)程,Spring的解決循環(huán)依賴(lài)是有前置條件的,要解決循環(huán)依賴(lài)我們首先要了解Spring Bean對(duì)象的創(chuàng)建過(guò)程和依賴(lài)注入的方式2023-01-01
SpringCloud Zuul過(guò)濾器和谷歌Gauva實(shí)現(xiàn)限流
這篇文章主要介紹了SpringCloud Zuul過(guò)濾器和谷歌Gauva實(shí)現(xiàn)限流,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
SpringBoot使用@Validated處理校驗(yàn)的方法步驟
@Validated?注解的主要目的是啟用和利用?Spring?的驗(yàn)證框架,它可以用于類(lèi)上也可以用于方法參數(shù)上,本文給大家介紹了SpringBoot使用@Validated優(yōu)雅的處理校驗(yàn)的方法步驟,通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08

