final關鍵字 ——Thinking in Java學習筆記(十一)
阿新 • • 發佈:2018-12-17
final的使用情況一般分為三種:資料、方法、類
final資料
final修飾的資料表示值不可變,引用不能改變。其中,對資料的修飾又分為:
1、final成員變數:由final修飾的類成員變數,如果是基礎資料型別就表示不能改變它的值,但如果是已經初始化了的引用型變數,表示不能改變該物件的引用,但物件本身還是能夠改變的。
例:
// 引用型變數是可以改變其引用的 public class Test13 { // 基礎資料型別是不允許被改變的 private final static int INDEX = 1; private final static Value V1 = new Value(1); public static void main(String[] args) { //INDEX ++; // The final field Test13.INDEX cannot be assigned // V1 = new Value(2);// Cannot make a static reference to the non-static field V1 V1.i = 2; // 改變物件本身是可以的,但不能改變物件的引用 } } class Value { int i; public Value(int i) { this.i = i; } }
這裡需要注意,既是final又是static的域(編譯期常量),一般使用大寫表示,同時字母間用下劃線分隔。
2、空白final:無初始值的final成員變數,在使用前必須要對它進行賦值,也就是在使用前必須確保它被初始化。
3、final引數:由final修飾的方法引數,意味著無法改變方法引數引用指向的物件。如果是數值的話就意味著不能被修改(其實就是說不能改變其指向的常量池中的物件),如果是引用型引數,則意味著不能改變其指向的堆中的物件。
例:
public void Test(final int i) { // i ++; // The final local variable i cannot be assigned. It must be blank and not using a compound assignment } public void Test(final Value v) { // v = new Value(2); // The final local variable v cannot be assigned. It must be blank and not using a compound assignment }
final方法
final方法表示禁止方法被覆蓋,但還是允許過載方法,只是不允許繼承的子類對該方法進行重寫。
我看有的說final鎖定的方法能夠提高效率,轉為內嵌呼叫,但事實上,如果你的方法很大,內嵌呼叫所帶來的那些效能提高就會被極大的縮減,因為相對於花費在方法內部的時間量,那點速度提升就沒那麼明顯了。
private其實都是隱式的指定為final的,因為它不能被子類所繼承,也就不存在“覆蓋”這一說法了。
final類
final類表示類不能被繼承。同時,類中的方法也隱式的是指定為final,因為沒有繼承,它們也就不能被覆蓋。