Java之 final關鍵字

參考:
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類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章