final、finally、finalize的詳細分析
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- final、finally、finalize的理解
- final,finalize,finally 的區別
- final,finalize,finally的區別
- final、finally、finalize的區別
- Java中final、finally、finalize的區別Java
- Java中final,finally,finalize的區別Java
- 闡述final、finally、finalize的區別
- Java之final、finalize、finally的區別Java
- final、finally、finalize()的區別(skycto JEEditor)
- Java中final、finally和finalize的區別Java
- Java中final,finalize和finally的區別Java
- 1.淺談final,finally,finalize的區別。
- final、finally與finalize三者的區別
- 【Java面試題系列】:Java中final finally finalize的區別Java面試題
- 『Java 語法基礎』final、finalize 和 finally 的不同之處Java
- 異常-面試題之final,finally和finalize的區別,如果在finally之前有return面試題
- final,finally,finallize的區別
- 【java】final、finally、finallize的區別Java
- JWT 詳細分析JWT
- appium的log詳細分析APP
- JWT 超詳細分析JWT
- PE頭詳細分析
- Https詳細分析HTTP
- js中cookie的使用詳細分析JSCookie
- C語言中的static 詳細分析C語言
- PE節表詳細分析
- CanOpen報文詳細分析
- spdk nvme盤probe的流程詳細分析
- 一款勒索病毒的詳細分析
- Will it finally: 關於 try/catch 的一些細節
- java中的finally詳解(finally中沒有return i,卻有i=XX)Java
- ORACLE AWR報告詳細分析Oracle
- Java ClassLoader 原理詳細分析Java
- Linux ptrace詳細分析系列(二)Linux
- phpcmsv9.6注入漏洞詳細分析PHP
- Android VectorDrawable SVG 命令詳細分析AndroidSVG
- 詳細分析Java中斷機制Java
- EmbedPE 1.13 詳細分析和脫殼