技術(shù)思考--談?wù)刦inal、finally、 finalize有什么不同?

問題思考

final可以用來修飾類、方法、變量,分別有不同的意義,final修飾的class代表不可以繼承擴(kuò)展,final的變量是不可以修改的,而final的方法也是不可以重寫的(override)??偟膩碚f用final修飾的是不可以進(jìn)行更改。

finally則是Java保證重點代碼一定要被執(zhí)行的一種機制。我們在try-catch-finally中必須關(guān)閉io流、jdbc連接等操作。

fnalize是基礎(chǔ)類java.lang.Object的一個方法,它的設(shè)計目的是保證對象在被垃圾收集前完成特定資源的回收。fnalize機制現(xiàn)在已經(jīng)不推薦使用,并且在JDK 9開始被標(biāo)記為deprecated。

結(jié)合項目中的應(yīng)用:

1.final可以修飾類或方法,讓別人清楚類不能進(jìn)行修改,方法不能重寫,可以有效避免開發(fā)者修改基礎(chǔ)功能

2.使用final修飾參數(shù)或者變量,也可以清楚地避免意外賦值導(dǎo)致的編程錯誤,該變量不可進(jìn)行重新賦值,但對于引用變量來說只是這個對象不能進(jìn)行賦值,對象中的屬性還是可以進(jìn)行賦值的

知識拓展


一、finalize是一種已經(jīng)被業(yè)界證明了的非常不好的實踐,為什么會導(dǎo)致這些問題?

finalize的執(zhí)行是和垃圾收集關(guān)聯(lián)在一起的,一旦實現(xiàn)了非空的fnalize方法,就會導(dǎo)致相應(yīng)對象回收呈現(xiàn)數(shù)量級上的變慢,有人專門做過benchmark,大概是40~50倍的下降。因為,finalize是在對象被垃圾收集前調(diào)用,這就意味著實現(xiàn)了finalize方法的對象是個“特殊公民”,JVM要對它進(jìn)行額外處理。fnalize本質(zhì)上成為了快速回收的阻礙者,可能導(dǎo)致對象經(jīng)過多個垃圾收集周期才能被回收。

二、有什么機制可以替換finalize嗎?

Java平臺目前在逐步使用java.lang.ref.Cleaner來替換掉原有的finalize實現(xiàn)。

三、列幾個 fianlly 不會被執(zhí)行的情況:

1. try-catch 異常退出。

? ?try{

? ? ? ? ?system.exit(1)

? ?}finally{

? ? ? ? ?print(abc)

? ?}

2. 無限循環(huán)

try{

? ? ? ?while(ture){

? ? ? ? ? ? print(abc)

? ? ? ?}

?}fnally{

? ? ? print(abc)

?}

3. 線程被殺死

當(dāng)執(zhí)行 try,fnally 的線程被殺死時。fnally 也無法執(zhí)行。

總結(jié):

1、不要在 fnally 中使用 return 語句,

2、fnally 總是執(zhí)行,除非程序或者線程被中斷。


四、String類為什么要設(shè)計成final?

String不可變很簡單,如下圖,給一個已有字符串"abcd"第二次賦值成"abcedl",不是在原內(nèi)存地址上修改數(shù)據(jù),而是重新指向一個新對象,新地址。String是不可變的關(guān)鍵都在底層的實現(xiàn),而不是一個final。不可變的好處是安全。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容