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