final關鍵字的使用(Thinking In Java)

final關鍵字最基本的含義就是表明“這個東西不能改變”。之所以這樣,可能是考慮到兩方面的因素:設計或效率。

final關鍵字可應用在三種場合: 數據、方法以及類

1. final數據

表明某個數據是“常數”,永遠不會改變。使用final定義,編譯器可以直接將常數值封裝到需要的計算過程裏。也就是說,計算可以在編譯期前執行,從而節省運行時的開銷。在JAVA中,這些常數必須屬於基本數據類型。並且在對這樣的一個常數進行定義的時候,必須給出一個值。

而當對象句柄使用final時,必須將句柄初始化到一個具體的對象,而且永遠不能將句柄指向另一個對象。然而,對象本身可以修改。

空白final

Java允許創建“空白final”。即不賦初始值,但空白final必須在實際使用前得到正確的初始化。如果將賦初始值的語句放在不同的構造器中,則final字段可以隨着調用不同的構造器而獲得不同的初始值。但一旦確定,值將無法改變。

final數據無法更改:

{
  final int i=5;
  i=6;
}

以上語句會在編譯期間出錯:
:cannot assign a value to final variable i=6;

final自變量

JAVA允許將自變量設成final屬性。即在方法的變量列表中進行聲明。這樣意味着在一個方法內部,不能改變自變量句柄所指向的東西。

2. final 方法

將一個方法標識爲final,則可防止任何繼承類改變這個方法的本來含義。即不可被覆蓋或改寫。

同時將一個方法設置成final後,編譯器可以把對那個方法的所有調用都嵌入到調用裏,即採用常規的代碼插入方法。因此可以提高程序效率。當然,如果方法體積太大,那麼程序就會變的臃腫。

因此,通常只有在方法的代碼量非常少,或者想明確禁止方法被覆蓋的時候,才應考慮將一個方法設置爲final 。

類中所有的private方法都自動成爲final。因爲我們不能從類外訪問final方法,所以它絕對不會被其他方法覆蓋。

3. final類

若在整個類定義前冠以final關鍵字,表明不希望從這個類繼承。而final類的數據成員既可以是final的,也可以不是。因爲final類禁止了繼承,所以final類中的所有方法都默認爲final。因爲此時不可能覆蓋它們。(當然可以再爲final類中的方法添加final指示符號,但這樣做沒有任何意義)

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