標籤:java
目錄
- 目錄
- final含義
- final變數
- final方法
- final類
- final關鍵字好處
final含義
final是Java中的一個保留關鍵字,可以聲明成員變數、方法和類。一旦你將引用聲明為final類型,你將不能再改變這個引用了。編譯器會檢查代碼,如果你試圖將變數再次初始化的話,編譯器會報編譯錯誤。
final變數
凡是對成員變數或者本地變數(在方法中的或者代碼塊中的變數稱為本地變數)聲明為final的都叫做final變數。下面是final修飾變數的例子:
final int constValue = 1;// constValue = 2; The final local variable constValue cannot be assigned.
補充點:
- final成員變數必須在聲明的時候初始化或者在建構函式中初始化,否則編譯器會報錯。
- 不能夠對final變數再次賦值。
- 在匿名類中所有變數都必須是final變數。
final方法
final也可以聲明方法。方法名前面加上final關鍵字,代表這個方法不可以被子類重寫。如果你認為一個方法的功能已經足夠完整了,子類中不需要改變該方法,你就可以將該方法聲明為final類型。
final聲明的方法比非final的方法快,因為在編譯的時候就已經靜態繫結了,不需要在運行時再動態綁定。下面是final方法的例子:
public class Person{ public final void printName() { System.out.println("wangzhengyi"); }}
final類
使用final來修飾的類叫做final類。final類通常功能是完整的,它們不能被繼承。Java中許多類是final的,例如String類。
不可變類的一個好處就是它自身是安全執行緒的,你不需要考慮多線程環境下的安全執行緒問題。要建立不可變類,需要實現如下幾個步驟:
- 將類聲明為final,使它不能被繼承。
- 將所有的成員聲明為私人的,這樣就不允許直接存取這些成員。
- 對變數不要提供setter方法。
- 將所有可變的成員聲明為final,這樣只能對它們賦值一次。
- 通過構造器初始化所有成員,進行深拷貝(deep copy)。
- 在getter方法中,不要直接返回對象本身,而是複製對象,並返回對象的拷貝。
注意:淺拷貝和深拷貝的區別:
- 淺拷貝(淺複製):被複製對象的所有變數都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,只複製對象的基本類型,物件類型仍屬於原來的引用。
- 深拷貝(深複製):被複製的所有變數都含有與原來的對象相同的值,除去那些引用其他對象的變數。那些引用其他對象的變數將指向被複製過的新對象,而不再是原有的那些被引用的對象。換言之,不僅複製對象的基本類型,同時也複製原對象中的對象。
不可變類樣本:
import java.util.HashMap;import java.util.Iterator;public class FinalClassExample { private final int id; private final String name; private final HashMap<Integer, String> hMap; public int getId() { return id; } public String getName() { return name; } /** * 可變對象的存取方法:返回對象的拷貝 * @return */ public HashMap<Integer, String> gethMap() { return (HashMap<Integer, String>)hMap.clone(); } /** * 實現深拷貝的構造器 */ public FinalClassExample(int id, String name, HashMap<Integer, String> map) { this.id = id; this.name = name; HashMap<Integer, String> tMap = new HashMap<Integer, String>(); int key; Iterator<Integer> iterator = map.keySet().iterator(); while (iterator.hasNext()) { key = iterator.next(); tMap.put(key, map.get(key)); } this.hMap = tMap; } /** * 實現淺拷貝構造器 */ /* public FinalClassExample(int id, String name, HashMap<Integer, String> map) { this.id = id; this.name = name; this.hMap = map; } */}
final關鍵字好處
使用final關鍵字的優勢如下:
- final關鍵字提高了效能。JVM和Java應用都會緩衝final變數。
- final變數可以安全的在多線程環境下進行共用,而不需要額外的同步開銷。
- 使用final關鍵字,JVM會對方法、變數以及類進行最佳化。
Java final關鍵字