淺析Java中的final關鍵字
談到final關鍵字,想必很多人都不陌生,在使用匿名內部類的時候可能會常常用到final關鍵字。另外,Java中的String類就是1個final類,那末今天我們就來了解final這個關鍵字的用法。下面是本文的目錄大綱:
1.final關鍵字的基本用法
2.深入理解final關鍵字
若有不正的地方,請多多體諒并歡迎指正。
請尊重作者勞動成果,轉載請標明原文鏈接:
http://www.cnblogs.com/dolphin0520/p/3736238.html
在Java中,final關鍵字可以用來修飾類、方法和變量(包括成員變量和局部變量)。下面就從這3個方面來了解1下final關鍵字的基本用法。
1.修飾類
當用final修飾1個類時,表明這個類不能被繼承。也就是說,如果1個類你永久不會讓他被繼承,就能夠用final進行修飾。final類中的成員變量可以根據需要設為final,但是要注意final類中的所有成員方法都會被隱式地指定為final方法。
在使用final修飾類的時候,要注意謹慎選擇,除非這個類真的在以后不會用來繼承或出于安全的斟酌,盡可能不要將類設計為final類。
2.修飾方法
下面這段話摘自《Java編程思想》第4版第143頁:
“使用final方法的緣由有兩個。第1個緣由是把方法鎖定,以防任何繼承類修改它的含義;第2個緣由是效力。在初期的Java實現版本中,會將final方法轉為內嵌調用。但是如果方法過于龐大,可能看不到內嵌調用帶來的任何性能提升。在最近的Java版本中,不需要使用final方法進行這些優化了。“
因此,如果只有在想明確制止 該方法在子類中被覆蓋的情況下才將方法設置為final的。
注:類的private方法會隱式地被指定為final方法。
3.修飾變量
修飾變量是final用得最多的地方,也是本文接下來要重點論述的內容。首先了解1下final變量的基本語法:
對1個final變量,如果是基本數據類型的變量,則其數值1旦在初始化以后便不能更改;如果是援用類型的變量,則在對其初始化以后便不能再讓其指向另外一個對象。
舉個例子:
上面的1段代碼中,對變量i和obj的重新賦值都報錯了。
在了解了final關鍵字的基本用法以后,這1節我們來看1下final關鍵字容易混淆的地方。
1.類的final變量和普通變量有甚么區分?
當用final作用于類的成員變量時,成員變量(注意是類的成員變量,局部變量只需要保證在使用之前被初始化賦值便可)必須在定義時或構造器中進行初始化賦值,而且final變量1旦被初始化賦值以后,就不能再被賦值了。
那末final變量和普通變量到底有何區分呢?下面請看1個例子:
1
2
3
4
5
6
7
8
9
10
11
|
public class Test
{ public static void main(String[]
args) { String
a = "hello2" ; final String
b = "hello" ; String
d = "hello" ; String
c = b + 2 ; String
e = d + 2 ; System.out.println((a
== c)); System.out.println((a
== e)); } } |
大家可以先想1下這道題的輸出結果。為何第1個比較結果為true,而第2個比較結果為fasle。這里面就是final變量和普通變量的區分了,當final變量是基本數據類型和String類型時,如果在編譯期間能知道它的確切值,則編譯器會把它當作編譯期常量使用。也就是說在用到該final變量的地方,相當于直接訪問的這個常量,不需要在運行時肯定。這類和C語言中的宏替換有點像。因此在上面的1段代碼中,由于變量b被final修飾,因此會被當作編譯器常量,所以在使用到b的地方會直接將變量b 替換為它的 值。而對變量d的訪問卻需要在運行時通過鏈接來進行。想必其中的區分大家應當明白了,不過要注意,只有在編譯期間能確切知道final變量值的情況下,編譯器才會進行這樣的優化,比以下面的這段代碼就不會進行優化:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public class Test
{ public static void main(String[]
args) { String
a = "hello2"
生活不易,碼農辛苦
------分隔線----------------------------
分享到:
------分隔線----------------------------
|