問題思考
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。不可變的好處是安全。