final、finally、finalize的詳細分析

ckxllf發表於2020-01-20

  java語言有有很多看起來相似,但用途卻完全不同的要素,那麼final,finally,finalize又有哪些不同之處呢?

  final

  final可以用來修飾類、方法、變數,分別有不同的意義,

  final修飾的class表示不可以繼承擴充套件

  final修飾的變數是不可以修改的

  final修飾的方法是不可以重寫的

  final執行去修飾某個引用,

  finally

  finally是保證java重點程式碼執行的一種機制,他可以配合我們的異常機制一起使用,我們可以使用try{}finally{}或者try{}catch(){}finally{}來關閉類似jdbc的連線,保證unlock鎖等動作.

  finalize

  finalize是java的一個方法,它的設計目的是java物件在被垃圾回收器回收之前,完成特定資源的回收,finalize機制現在已經不推薦使用,

  在一般情況下不能指望finalize來進行回收資源,為什麼呢?簡單來說,無法保證finallize什麼時候執行,執行是否符合預期,使用不當會影響效能,導致程式死鎖,掛掉等。通常來說上面提到的try{}finally{}機制是回收資源的辦法,如果特別需要額外處理的話,可以考慮java提供的cleaner機制(垃圾回收機制)或者其他替代方法.

  finalize是和垃圾收集相關聯的,一但呼叫finalize方法,就會導致相應的物件回收呈現數量集上的變慢,有人專門做過研究,實現該方法速度大概是40-50倍的下降,因為finallize被設計成在物件本身垃圾回收之前呼叫,這就意味者實現finalize方法的物件是個特殊供應。cdn要對他進行額外處理,finalize本質上成為快速回收的阻礙,可能導致你的物件經過多個垃圾經期,才能被回收.如果我們告知jvm來回收也是不痛不癢的.就向我們用過的jdbc連線池,其中有一個close方法,他是釋放資源的,清空某個池子,以供下回使用,如果我們指望finalize進行回收的話,有可能造成記憶體溢位.那麼只能讓他作為程式的守門員.其中finalize也會掩蓋一些出錯資訊.

  java用cleaner來替換調finalize的所有實現.利用了幻象引用。這是一個清理機制.利用幻象引用或者佇列可以保證資源被釋放,他有自己的執行緒,避免了死鎖的情況。

  mysqljdbc就用了幻象引用機制。

  隱藏的問題

  效能,併發,物件生命週期,垃圾回收等過程方面的問題。

  推薦使用final關鍵字來表示我們程式碼的語義和邏輯密度,這已經被證明在很多場景下的實現,比如我們可以將方法或類宣告為final,這樣就可以明確告訴別人,這些類和方法是不可以修改的.如果你關心過java的核心類庫和原始碼的話,你就會發現java下的很多類都被宣告為final class,這可以防止api使用者改變基礎功能,某種情況這是保證平臺安全的必要手段,使用final修飾方法或者變數,可以避免意外佈局導致的程式設計錯誤,甚至有人明確推薦將所有方法引數、本地變數、成員變數宣告為final,final在一定程度上產生不可變的效果,所以可以用於保護只讀資料,尤其是在併發程式設計中,因為明確的不能再賦值final變數,有利於減少額外的同步開銷,也可以省略防禦性複製的必要,fianl在很多場景中可以提高效能,利用fianl可能將cdn方法進行內連,可以改善編譯器進行編譯的能力等等,坦白說很多類似的結果都是基於假設得出的,比如現代高效能cdn判斷內斂,未必依賴final的提示,fianl關鍵字對效能的影響,沒有考慮的必要,如果在開發中要想以這樣的方式來提高效能,那真的是沒有必要.

  finally基礎筆試題

  public class finally_demo{

  public static char Label;

  public static void main(String[] args){

  System.out.println(test_finally());

  System.out.println(Label);

  } 鄭州引產手術費用多少錢

  public static char test_finally(){

  try{

  System.out.println('A');

  return Label= 'A';

  }finally{

  System.out.println('B');

  Label= 'B';

  }

  )

  }

  輸出結果:

  ABAB

  結構分析:

  1.這道題考察的點是:return和finally的執行順序是什麼;

  執行過程:

  前面輸出AB,大部分人是沒有疑惑的,這是因為Test1方法裡面的兩個輸出語句。

  之後,

  先將label='A’進行賦值,

  後會檢測是否存在finally的語句,

  有,則執行finally的語句,Label=‘B’,故最終結果Label的值是B!;

  最終將return語句返回(此時並不進行賦值操作,Label雖然等於B,但是返回的仍然是剛才尚未執行finally語句前的值)。

  建立自定義不可變類需要遵守的規則:

  1、使用private和final修飾成員變數。

  2、提供帶參構造方法,用於初始化成員變數。

  3、不要為成員變數提供setter方法。

  4、如果成員變數中有可變類時需要重寫Object中的hashCode方法和equals方法


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69945560/viewspace-2674086/,如需轉載,請註明出處,否則將追究法律責任。

相關文章