final關鍵字的使用
1.修飾類
表明這個類不能被繼承,類中所有成員方法都會被隱式地指定為final方法,比如:String類,Integer及其他包裝類
2.修飾方法
表明該方法不能被子類重寫
3.修飾變數
如果final修飾基本資料型別的變數,其數值一旦初始化後不能被修改。
如果final修飾引用型別的變數,初始化後不能再讓其指向另一個物件,但引用型別變數指向的物件的內容是可變的。
例如:
class Person {
public int age = 0
}
final Person person = new Person();
person.age = 20; // 引用變數的內容是可變的
複製程式碼
如果final修飾成員變數時,成員變數必須在定義時或者構造器中進行初始化賦值,初始化賦值後不能被修改。
如果final修飾本地變數(方法中或程式碼塊中的變數為本地變數)時,本地變數必須在宣告時賦值,初始化賦值後不能被修改。
final關鍵字的優點
-
final關鍵字提高了效能,JVM和Java應用都會快取final變數
-
final變數可以安全的在多執行緒環境下進行共享,而不需要額外的同步開銷。
-
使用final關鍵字,JVM會對方法、變數及類進行優化。
例如:
final String name = "Tom"; 複製程式碼
編譯器在編譯期間知道確切值,把它當做編譯器常量使用,即在用到該final變數的地方,相當於直接訪問這個常量,不需要在執行時確定。
final String name = getName(); 複製程式碼
編譯器在編譯期間不知道確切值,就不會做優化處理。
final關鍵字的注意點
-
介面中宣告的所有變數本身都是final的。
-
在匿名類中所有變數都必須是final變數。
-
final和abstract這兩個關鍵字是反相關的,final類不可能是abstract的
-
對於集合物件宣告為final,其引用不能被更改,但是可以向其中增加、刪除或改變內容。
例如:
private final List<Person> persons = new ArrayList<Person>(); persons.add("Tom"); persons.add("Jack"); //persons = new Vector(); --- 引用不能被更改 複製程式碼
-
將類、方法、變數宣告為final能夠提高效能、這樣JVM就有機會進行估計,然後優化。
-
static修飾成員變數表示只儲存一份副本,final修飾成員變數用來保證變數不可變。
-
final方法在編譯階段繫結,稱為靜態繫結。