final全方位深度剖析
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 Final
一個變數當且僅當在如下的情況才會被認為是effectively
1.未被宣告為final
#2 .只賦了一次值
最簡單的方式去解釋effectively final就是想像它加上了final修飾,如果這樣修改後,程式仍然運行無誤(在編譯通過的情況下^0^),並且跟原來的運行結果一致,那麼這個變數可以說是effectively final。
final的好處
將局部變數限制為有效的不可變變數旨在讓開發人員的更好的處理並發及線程安全的開發。 如果管理不當,可變字段始終是並發問題的潛在來源。
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中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java中final、finally、finalize的區別,需要具體程式碼範例在Java程式設計中,經常會遇到final、finally、finalize這三個關鍵字,它們雖然拼字相似,但卻有不同的意思和用法。本文將詳細解釋這三個關鍵字的區別,同時給出程式碼範例以幫助讀者更好地理解。一、final關鍵字final關鍵字可以用於類別、方法和變數。它的作用是使被修飾的類

常量變數是其值固定且程式中只存在一個副本的變數。一旦你聲明了一個常數變數並給它賦值,你就不能在整個程式中再次改變它的值。與其他語言不同,Java不直接支援常數。但是,你仍然可以透過宣告一個變數為靜態和final來創建一個常數。靜態-一旦你聲明了一個靜態變量,它們將在編譯時加載到內存中,即只有一個副本可用。 Final-一旦你宣告了一個final變量,就不能再修改它的值。因此,你可以透過將實例變數宣告為靜態和final來在Java中創建一個常數。範例 示範classData{&am

在java中,final可以用來修飾類別、方法和變數。 final修飾類,表示該類是無法被任何其他類繼承的,意味著此類在一個繼承樹中是一個葉子類,並且此類的設計已被認為很完美而不需要進行修改或擴展。 final修飾類別中的方法,表示該類別是無法被任何其他類別繼承的,不可以被重寫;也就是把該方法鎖定了,以防止繼承類別對其進行更改。 final修飾類別中的變量,表示該變數一旦被初始化就不可改變。

Java中建立final物件有兩種方法:宣告final變數或使用final修飾符宣告類別。宣告final變數時,物件透過初始化器建立;宣告final類別時,該類別實例不可變。重要的是,final物件的引用仍然可以改變,但它們指向的物件不可變。

最終變數只能明確初始化一次。宣告為Final的引用變數永遠不能重新指派以引用不同的物件。但是,物件內的資料是可以更改的。因此,物件的狀態可以更改,但引用不能更改。對於變量,final修飾符通常與static一起使用以使常數成為類別變量。範例publicclassTest{ finalintvalue=10; //Thefollowingareexamplesofdeclaringconstants: &a

近日ColorOS15率先開啟Beta內測,有網友曝光了相關介面,來看看如何~如上圖所見,有網友曬出了OPPOFindX7升級ColorOS15Beta後的「關於本機」介面,除了頂部圖案有大變外,下半部的配置資訊也從先前的兩列變成了全單列縱向分佈。附上華為、榮耀、小米、OPPO、vivo、魅族6家品牌手機現在最新版本下的“關於本機/手機”界面,大家可以來說說更喜歡哪家的佈局~具體關於ColorOS15,此前消息稱其除了大範圍支援LivePhoto實況照片外,還將"支援AirDrop&

近日ColorOS15率先開啟Beta內測,有網友曝光了相關介面,來看看如何~如上圖所見,有網友曬出了OPPOFindX7升級ColorOS15Beta後的「關於本機」介面,除了頂部圖案有大變外,下半部的配置資訊也從先前的兩列變成了全單列縱向分佈。附上華為、榮耀、小米、OPPO、vivo、魅族6家品牌手機現在最新版本下的“關於本機/手機”界面,大家可以來說說更喜歡哪家的佈局~具體關於ColorOS15,此前消息稱其除了大範圍支援LivePhoto實況照片外,還將"支援AirDrop&

PHP是一種流行的開源伺服器端腳本語言,廣泛應用於Web開發。 PHP語言不僅易於學習和使用,而且支援多種程式設計範例、物件導向的程式設計和函數式程式設計等。在PHP中,有一些特殊的語法關鍵字,如Static、Final、Abstract等,這些關鍵字在物件導向程式設計中具有特殊的作用。本文將對這些關鍵字進行詳細介紹。 Static關鍵字在PHP中,Static關鍵字有兩種用法
