final關鍵字可以用於修飾類、變數和方法。final修飾變數時,表示該變數一旦獲得了初始值就不可改變。
final成員變數
final修飾的類Field、執行個體Field能指定初始值的地方如下:
—>類Field:必須在靜態初始化塊中或聲明該Field時指定初始值。
—>執行個體field:必須在非靜態初始化塊、聲明該Field或構造器中指定初始值。
如果在普通初始化塊中已經為某個執行個體Field指定了初始值,則不要再在構造器中為該執行個體Field指定初始值。類Field同理。
/** * final成員變數測試 * 該程式詳細示範了final修飾成員變數的各種具體情形 */package Chapte5;public class FinalVariableTest { //定義成員變數時指定預設值,合法 final int a = 66; //下面變數將在構造器或初始化塊中分配初值,合法 final String str; final int c; final static double d; //ch既沒有在定義時指定初值,也沒有在構造器或初始化塊中分配初值,這樣定義不合法 //final char ch; { str ="hello"; } static{ d=5.6; } public FinalVariableTest(){ c=5; } public void changeFinal(){ //不能在普通方法中為final變數指定初值或更改初值 //d=1.2; } public static void main(String[] args) { FinalVariableTest ft= new FinalVariableTest(); System.out.println(ft.d); System.out.println(ft.a); }}final局部變數
使用final修飾局部變數時,既可以在定義時指定預設值,也可以不指定預設值。如果final修飾的局部變數在定義時沒有指定預設值,則可以在後面的程式碼片段中對該final變數賦初值,但只能一次,不能重複賦值。 final修飾基本類型變數和參考型別變數的區別
當使用final修飾類型變數時,不能對基本類型變數重新賦值,因此基本類型變數不能改變。單對於參考型別變數而言,它儲存的僅僅是一個引用,final只能保證這個參考型別變數所引用的地址不會改變,既一直引用同一個對象,但這個對象完全可以發生改變。 定義宏變數
final變數只要滿足三個條件,它就不再是一個變數,而是一個直接量(宏變數):
(1)使用final修飾;
(2)在定義該final變數時就指定了初始值;
(3)該初始值可以在編譯時間就被確定下來。 final方法
final修飾的方法不可被重寫。 final類
final修飾的類不可以繼承。