Java修飾符 --- final
final 關鍵字的好處:
1.final 關鍵字提高了效能,JVM 和 Java 應用都會快取 final
2.final 變數可以安全的在多執行緒環境下進行共享,而不需要額外的同步開銷
3.使用 final 關鍵字,JVM 會對方法、變數以及類進行優化
@
目錄一、修飾變數
-
當 final 修飾一個基本資料型別或者引用型別時,一旦在初始化之後,值不能改變,但是引用型別指向的物件的值是可以改變的(因為引用型別存的是一個地址,被 final 修飾時,地址不變就好了)
-
final 修飾成員變數是,必須要顯示初始化,要麼是在宣告的時候賦值
-
注意:final 修飾物件,進行宣告時,必須初始化的值要是具體的物件,不能是指向另一個物件
public class finalTest { public static void main(String[] args) { final person pers = new person(); pers = new person(); } } class person{ String name = "張無忌"; }
例如上述程式碼中:
pers = new person();
二、類的 final 變數和普通變數的區別?
-
例子:
public class staticTest { public static void main(String[] args) { String A = "final999"; final String B = "final"; String C = "final"; String str1 = B + 999; String str2 = C + 999; System.out.println(A == str1);// true System.out.println(A == str2);//false System.out.println(str1.equals(str2));//true } }
-
可以從結果看出,
str1
和str2
兩個物件的內容是相等的,但是之所以一個為 true,一個為 false,就是 final 修飾變數和普通變數的區別了首先,物件 A 的值"final999"儲存在常量池,str2 的值為引用變數 C 拼接"999",對應變數 C 的訪問需要在執行時通過儲存的地址才能確定,而 str1 被 final 修飾,當變數為基本資料型別、String型別時,編譯器會把他當作編譯期常量使用(靜態繫結),也就是編譯期的時候,str1 的值就完成了拼接,為"final999"
三、修飾方法
-
使用 final 方法的原因:其一是將方法鎖定,防止任何繼承類修改它的含義,其二是提高效率,因為在編譯時已經靜態繫結了,不需要在執行時動態繫結
-
父類中被 final 修飾的方法,不能被重寫(因為重寫的前提就是子類繼承父類的方法),需要注意的是,如果父類中 final 修飾的方法同時訪問許可權為
private
,子類就可以定義相同的方法名和引數,因為子類沒有直接繼承,而是重新定義的public class finalTest extends A { public static void main(String[] args) { } public void set() { } } class A { //當方法為public時,報錯 // public final void set(){ // } private final void set() { } }
四、修飾類
- 當 final 修飾一個類時,表明這個類不能被繼承
- 需要注意的是:final 類中的成員變數可以自行設為 final,但是 final 類中所有的成員方法都會被隱式地指定為 final 方法
- 使用 final 修飾類的時候,謹慎選擇,除非以後不會用來繼承或者出於安全考慮