1. 程式人生 > >final關鍵字 ——Thinking in Java學習筆記(十一)

final關鍵字 ——Thinking in Java學習筆記(十一)

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,因為沒有繼承,它們也就不能被覆蓋。