參考:
http://baijiahao.baidu.com/s?id=1601084106055683243&wfr=spider&for=pc
Java編程思想
final關鍵字的作用
在Java中,final關鍵字可以用來修飾成員函數,成員變量和類.。下面分別介紹。
1. final修飾數據
1.1 修飾類的成員變量
**當final修飾成員變量時,此時表示常量,說明該屬性是隻讀的。**總得來說,final既可以修飾基本數據類型,也可以修飾對象引用。
1)**必須被顯式初始化值,而且只能被初始化一次。**爲被final修飾的成員變量賦值,有兩種方式:1:直接賦值;**2:在構造方法中賦初值。**換句話說,**JVM並不會爲final常量執行默認初始化。**一旦爲final修飾的屬性賦初值之後,就不能再改變了(即不能再次賦值)。
2)如果修飾的成員變量是基本類型,則表示這個常量的值不能改變。
3)如果修飾的成員變量是一個引用類型(對象引用),則表示引用的地址的值不能修改,但是這個引用所指向的對象的內容還是可以改變的。
1.2 修飾局部變量
而如果使用final修飾方法中的參數,則表明該參數只允許讀,而不允許修改。
void f(final int i){// 局部變量示例
i++; // can’t change(編譯錯)
}
2. final修飾方法
使用final方法的原因有2個。第一個原因就是將方法鎖定,以防止任何繼承類修改它,即明確禁止覆蓋(重寫)。具體來說,**如果父類中有被final修飾的方法,那麼子類不能覆蓋(重寫)該方法。**第二個原因出於效率因素。這在Java早期實現是正確的,現在看來這個原因已不再被支持了。多說一句,出於效率考慮的意思就是將final方法直接嵌套在調用final方法的代碼內(即相當於內聯函數),這樣就減少了方法調用時所產生的入棧、出棧、保存上下文等操作所帶來的時間消耗。這一點和C++中的friendly修飾的方法很像。
2.1 final與private的關係
值得注意的是,**Java中類中所有的private方法都隱式地被指定爲final方法。**可以在編寫代碼時對private方法添加final關鍵字,但這與不加final關鍵字效果是一樣的。就像下面的代碼所表現的,g方法和f方法實際上是一樣的意思。
class WithFinal{
// Identical to "private" alone
private final void f(){ System.out.println("WithFinal.f()")}
// Also automatically "final"
private void g(){System.out.println("WithFinal.f()")}
}
上述代碼實則表明,使用private修飾方法就相當於使用private final修飾方法。更進一步,上面的語句隱藏了一句很重要的話,private方法不允許被覆蓋。
3. final修飾類
final修飾類則表示該類不允許被繼承,即該類永遠不會有子類,比如熟知的String類。具體來說,1)被final修飾的類,final類中的成員變量可以根據實際需要設計爲final。2) **一旦final修飾類,final類中的成員方法都會被隱式的指定爲final方法。**一般來說,我們通常都會將工具類設計成爲一個final類。