1. 程式人生 > >Java 創建不可變對象-final關鍵字的使用總結

Java 創建不可變對象-final關鍵字的使用總結

使用 基本 問題 分配 變量 net 分配內存 nal 對象

嚴格地說final修飾的變量不可被改變,一旦獲得了初始值,該final變量的值就不能被重新賦值,因此final修飾成員變量和修飾局部變量時有一定的不同。

1. final成員變量

一般的成員變量是隨類初始化或對象初始化而初始化的。當類初始化時,系統會為該類的類field分配內存,並分配默認值。也就是說,當執行靜態初始化塊時可以對類Field賦初值;當執行普通初始化塊、構造器時可對實例Field賦初值。因此,成員變量的初始值可以在定義該變量時指定默認值,也可以在初始化塊、構造器中指定初始值。如果沒有在以上各種情況下對類成員變量賦初值,那麽系統將會給final 修飾的類成員變量,一個默認的值,比如:0、’\u0000’\、false或者null。(這時候其實final成員變量也就失去了存在的意義)。
歸納起來,使用final成員變量需要註意以下幾個問題:
靜態Field :必須在靜態初始化塊中或聲明該Field時指定初始值
普通Field:必須在非靜態初始化塊、聲明該Field或構造器中指定初始值
final修飾的類成員,程序員最好顯示地指定其初始值

2. final局部變量
系統不會對局部變量進行初始化,局部變量必須由程序員顯示初始化。因此使用final修飾局部變量時,既可以在定義時指定默認值,也可以不指定默認值。但是只能初始化一次。

3. final修飾基本類型變量和引用類型變量的區別
1). 當final修飾基本變量類型時,不能對基本類型變量重新賦值,因此基本類型變量不能被改變
2). 當final修飾引用類型變量時,final只保證這個引用類型變量所引用的地址不會改變,即一直引用同一個對象,但是這個對象(對象的非final成員變量的值可以改變)完全可以發生改變

4. 可執行“宏替換”的final變量
對於一個final變量來說,不管它是類field、實例field,還是局部變量,只要該變量滿足3個條件,這個final變量就不再是一個變量,而是相當於一個直接量。
1). 使用final 修飾符修飾
2). 在定義該field變量時指定了初始值
3). 該初始值可以在編譯時就被確定下來

5. final修飾的方法不可以被重寫,final修飾的類不可以有子類

學習資源

http://blog.csdn.net/u010761376/article/details/50564415

Java 創建不可變對象-final關鍵字的使用總結