Java有一個關鍵字final,一個變數可以宣告為final類型,一個final類型的變數只能被賦值一次。如果一個final變數被重複賦值將會出現編譯錯誤。
final關鍵字的意義?
final在Java中是一個保留的關鍵字,可以宣告成員變數、方法、類別以及本地變數。一旦你將引用宣告作final,你將不能改變這個引用了,編譯器會檢查程式碼,如果你試圖將變數再次初始化的話,編譯器會報編譯錯誤。
什麼是final變數?
凡是對成員變數或本地變數(在方法中的或程式碼區塊中的變數稱為本地變數)宣告為final的都叫作final變數。 final變數經常和static關鍵字一起使用,作為常數。以下是final變數的範例:
public static final String LOAN = "loan";
LOAN = new String("loan") //invalid compilation error
final變數是唯讀的。
什麼是final方法?
final也可以宣告方法。方法前面加上final關鍵字,代表這個方法不可以被子類別的方法重寫。如果你認為一個方法的功能已經夠完整了,子類別中不需要改變的話,你可以宣告此方法為final。 final方法比非final方法快,因為在編譯的時候已經靜態綁定了,不需要在執行時再動態綁定。以下是final方法的範例:
class PersonalLoan{ public final String getName(){ return "personal loan"; } } class CheapPersonalLoan extends PersonalLoan{ @Override public final String getName(){ return "cheap personal loan"; //compilation error: overridden method is final } }
什麼是final類別?
使用final來修飾的類別叫做final類別。 final類別通常功能是完整的,它們不能被繼承。 Java中有許多類別是final的,譬如String, Interger以及其他包裝類別。以下是final類別的實例:
final class PersonalLoan{ } class CheapPersonalLoan extends PersonalLoan{ //compilation error: cannot inherit from final class }
final關鍵字的好處
下面總結了一些使用final關鍵字的好處
final關鍵字提高了效能。 JVM和Java應用程式都會快取final變數。
final變數可以安全的在多執行緒環境下進行共享,而不需要額外的同步開銷。
使用final關鍵字,JVM會對方法、變數及類別進行最佳化。
一個變數當且僅當在如下的情況才會被認為是effectively
1.未被宣告為final
#2 .只賦了一次值
最簡單的方式去解釋effectively final就是想像它加上了final修飾,如果這樣修改後,程式仍然運行無誤(在編譯通過的情況下^0^),並且跟原來的運行結果一致,那麼這個變數可以說是effectively final。
將局部變數限制為有效的不可變變數旨在讓開發人員的更好的處理並發及線程安全的開發。 如果管理不當,可變字段始終是並發問題的潛在來源。
我覺得將變量,方法參數等宣告為final是很好的習慣。它可以很好的提醒團隊裡的其它人,不要輕意的去修改它,拋開這個不提,聲明為final,編譯器在編譯成class檔案時,會對此進行很好的最佳化。
有很多的論點反對」在源文件中使用final關鍵字可以實現類別文件的最佳化是不正確的“,強烈建議去讀一下Robert Simons Jr的《Hardcore Java 》關於final關鍵字的使用及優化的詳情。
在一個應用程式中final關鍵字讓你的程式碼的意圖看起來會很明顯,聲明以後就不會被更改,這樣很安全。
public class FinalTest { public static final int N_ITERATIONS = 10_00_000; public static String testFinal() { final String a = "a"; final String b = "b"; return a + b; } public static String testNonFinal() { String a = "a"; String b = "b"; return a + b; } public static void main(String[] args) { long tStart, tElapsed; tStart = System.currentTimeMillis(); for (int i = 0; i < N_ITERATIONS; i++) testFinal(); tElapsed = System.currentTimeMillis() - tStart; System.out.println("Method with finals took " + tElapsed + " ms"); tStart = System.currentTimeMillis(); for (int i = 0; i < N_ITERATIONS; i++) testNonFinal(); tElapsed = System.currentTimeMillis() - tStart; System.out.println("Method without finals took " + tElapsed + " ms"); } }
運行結果:
Method with finals took 5 ms Method without finals took 273 ms
final可以讓你宣告的變數更安全,讓你的程式碼看起來更清晰,Effective Java中也是提倡使用immutable class滴。
以上是final全方位深度剖析的詳細內容。更多資訊請關注PHP中文網其他相關文章!