關于Java中finalize析構方法的作用詳解
一. 析構方法
1. 概念
我們現(xiàn)在已經(jīng)知道,構造方法負責創(chuàng)建一個Java的類對象,并可以對該對象進行初始化。與此相對應的,其實還有一個方法,可以負責對象的銷毀,這個負責對象銷毀的方法,就叫做析構方法。在Java中,有一個專門的析構方法,即finalize()方法!
2. 作用
finalize()析構方法負責回收Java對象所占用的內(nèi)存,該方法一般是在對象被垃圾收集器回收之前調(diào)用。通常我們會在finalize()方法中,指定對象銷毀時要執(zhí)行的操作,比如關閉對象打開的文件、IO流、釋放內(nèi)存資源等清理垃圾碎片的工作。
3. 特點
finalize()析構方法具有以下這些特點:
- 垃圾回收器是否會執(zhí)行finalize方法,以及何時執(zhí)行該方法,是不確定的;
- finalize()方法有可能會使對象復活,恢復到可觸及的狀態(tài);
- 垃圾回收器執(zhí)行finalize()方法時,如果出現(xiàn)異常,垃圾回收器不會報告異常,程序會繼續(xù)正常運行。
二. 基本使用
1. finalize簡介
在大多數(shù)情況下,Java的內(nèi)存和垃圾回收都是由JVM的GC機制來自動完成。如果我們想手動實現(xiàn),就可以使用finalize()方法,但該方法的執(zhí)行與否是不確定的。也就是說,即使我們調(diào)用了finalize()方法,JVM也不一定就會立刻執(zhí)行垃圾回收操作,這個取決于當前系統(tǒng)的內(nèi)存占用情況。
另外finalize()是一個被protected關鍵詞修飾的方法,可以確保該方法不會被該類以外的代碼調(diào)用。在每個Java類中都有finalize()方法,我們可以復寫當前類中的finalize()方法。
@Override
protected void finalize(){
// 在這里終結代碼
}2. 代碼案例
接下來設計一個代碼案例,來給大家講講析構方法的基本使用。
2.1 Counter計數(shù)器
我們先來定義一個Counter計數(shù)器類,設計一個靜態(tài)的計數(shù)器變量,通過方法調(diào)用改變count的值。
/**
* @author 一一哥Sun
*/
public class Counter {
private static int count = 0; // 計數(shù)器變量
public Counter() {
// 構造方法
this.count++; // 創(chuàng)建實例時增加值
}
public int getCount() {
// 獲取計數(shù)器的值
return this.count;
}
@Override
protected void finalize() {
// 析構方法
this.count--; // 實例銷毀時減少值
System.out.println("對象銷毀");
}
}以上案例中,static、@override等關鍵字,有些同學可能還不明白是怎么回事!先別急,后面我們都會學到,這里請大家先照著代碼練習一下。
2.2 CounterTest測試類
接著我們再創(chuàng)建第2個類,對Counter里的finalize()進行測試。
/*
* @author
* QQ:2312119590
* CSDN、掘金、知乎找我哦
*/
public class CounterTest {
public static void main(String[] args) {
Counter cnt1 = new Counter(); // 創(chuàng)建第一個實例對象
System.out.println("數(shù)量:" + cnt1.getCount()); // 輸出1
Counter cnt2 = new Counter(); // 創(chuàng)建第二個實例對象
System.out.println("數(shù)量:" + cnt2.getCount()); // 輸出2
cnt2 = null; // 銷毀實例2
try {
System.gc(); // 手動調(diào)用清理內(nèi)存的gc()方法
Thread.currentThread().sleep(1000); // 延時1000毫秒
System.out.println("數(shù)量:" + cnt1.getCount()); //再次輸出1,說明有個對象被銷毀
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}因為finalize()方法具有不確定性,也就是說,該方法到底會不會起作用是不一定的!所以我們在程序中可以調(diào)用 System.gc()方法或者 Runtime.gc()方法,來顯式地提醒垃圾回收器盡快去執(zhí)行垃圾回收操作。最終執(zhí)行效果如下圖所示:

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

