欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Java中finalize析構(gòu)方法的作用詳解

 更新時(shí)間:2023年05月11日 10:11:08   作者:一一哥Sun  
構(gòu)造方法用于創(chuàng)建和初始化類對(duì)象,也就是說,構(gòu)造方法負(fù)責(zé)”生出“一個(gè)類對(duì)象,并可以在對(duì)象出生時(shí)進(jìn)行必要的操作,在這篇文章中會(huì)給大家簡(jiǎn)單介紹一下析構(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)文章

最新評(píng)論