亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java 8 關于 Finalize 方法的斷言正確嗎?

Java 8 關于 Finalize 方法的斷言正確嗎?

慕田峪4524236 2024-01-17 16:47:40
我一直在閱讀 Kathy Sierra + Bert Bates 撰寫的《OCA Java SE 8 程序員 I 考試指南》一書。關于 Finalize 方法,我不太明白。第 218 頁指出:調用finalize()實際上可以導致保存對象免遭刪除。稍后第 222 頁:您可以從內部使對象不符合 GC 條件finalize()。英語不是我的母語,但我在這兩種情況下的理解是該finalize()方法可以防止對象被垃圾收集?是這樣嗎?還是我誤解了它?
查看完整描述

3 回答

?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

這實際上更像是一個理論上的事情:當對象不再被其他活動對象引用時,它們就有資格進行垃圾回收。

因此:您可以嘗試finalize().?從理論上講,這將阻止該物體被移除。

實際上有一個“模式名稱”:對象復活。現在,這是一種模式,還是更多的模式,值得爭論。

(就我個人而言:我永遠不會這樣做,而且我從來沒有遇到過需要使用這種模式的情況)


查看完整回答
反對 回復 2024-01-17
?
狐的傳說

TA貢獻1804條經驗 獲得超3個贊

Finalize 是由 JVM 而不是由用戶調用的方法,該方法在對象被垃圾收集之前執行,您可以重寫 Finalize 方法以在對象被處置之前執行清理操作,或者正如書中所述,有可能您可以防止該對象被垃圾收集。


您可以參考下面的代碼作為避免對象被垃圾收集的示例。


class Example { 


    static Example y; 


    void func() { 

        Example x = new Example(); 

    } 


    pubic void finalize() { 


        y = this; // Putting the reference id 

        // of the current object 

        // into the static variable y 


        System.out.println("The object won't be collected by the garbage collector"); 


    } 


    public static void main(String a[]) {

        func(); // function called 

    } 

}


查看完整回答
反對 回復 2024-01-17
?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

嗯,確實如此。


finalize()當 GC 決定應該刪除該對象時,將調用該方法,但這并不意味著該對象將在finalize完成后立即被刪除。


IT DOESN'T WORK THIS WAY:

_________________________

IF shouldBeRemoved(object)

   object.finalize();

   remove(object);

執行后finalize,GC將再次檢查該對象是否仍應被刪除。為了符合刪除資格,不應從可從根對象訪問的任何對象引用對象。


IT WORKS THIS WAY

_________________

LABEL

IF shouldBeRemoved(object)

    object.finalize();

    IF shouldBeRemoved(object)

        remove(object);

    ELSE

        GOTO LABEL

讓我們想象一下以下情況:


class Foo {

    Application a;


    Foo(){};


    @Override

    public void finalize() {

        this.a = Application.getInstance();

    }

}

其中Application是代表 的根對象的類Application。在這種情況下,由于a仍然可達,Foo之前符合刪除資格的類的對象剛剛復活。


重要說明


不能保證 會finalize被調用,因為它需要另一個對象來處理finalize被調用的方法,因此如果堆上沒有足夠的可用空間,對象可能會在不調用的情況下被銷毀finalize。


查看完整回答
反對 回復 2024-01-17
  • 3 回答
  • 0 關注
  • 171 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號