技術思考--談談final、finally、 finalize有什么不同?

問題思考

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

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

fnalize是基礎類java.lang.Object的一個方法,它的設計目的是保證對象在被垃圾收集前完成特定資源的回收。fnalize機制現在已經不推薦使用,并且在JDK 9開始被標記為deprecated。

結合項目中的應用:

1.final可以修飾類或方法,讓別人清楚類不能進行修改,方法不能重寫,可以有效避免開發者修改基礎功能

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

知識拓展


一、finalize是一種已經被業界證明了的非常不好的實踐,為什么會導致這些問題?

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

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

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

三、列幾個 fianlly 不會被執行的情況:

1. try-catch 異常退出。

? ?try{

? ? ? ? ?system.exit(1)

? ?}finally{

? ? ? ? ?print(abc)

? ?}

2. 無限循環

try{

? ? ? ?while(ture){

? ? ? ? ? ? print(abc)

? ? ? ?}

?}fnally{

? ? ? print(abc)

?}

3. 線程被殺死

當執行 try,fnally 的線程被殺死時。fnally 也無法執行。

總結:

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

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


四、String類為什么要設計成final?

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容