您好,登錄后才能下訂單哦!
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);
} 鄭州引產手術費用多少錢 https://yiyuan.120ask.com/art/307587.html
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方法
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。