(長沙學院計算機工程與應用數(shù)學學院 湖南長沙 410075)
final修飾的類、變量和方法具有以下特性:
1. final修飾的類不能被繼承。
2. final修飾的方法不能被子類重寫。
3. final修飾的變量(成員變量和局部變量)是常量,只能賦值一次。
修飾變量是final用得最多的地方,數(shù)據(jù)類型有基本數(shù)據(jù)類型與引用數(shù)據(jù)類型,當final修飾基本數(shù)據(jù)類型時,被修飾的數(shù)據(jù)就相當于我們自己直接定義的常量,理解與應用與一致,但當修飾引用數(shù)據(jù)類型變量時,會有所不同,這是本文接下來要重點闡述的內容。首先了解一下final變量的基本語法:對于一個final變量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個對象。 接下來舉個例子深入分析final關鍵字修飾引用類型數(shù)據(jù)的性能:
上述代碼運行結果為:
分析上述輸出結果可知,就final修飾基本數(shù)據(jù)而言,我們會得出第一個輸出結果應該也是false,因為final修飾變量時,就相當于常量。但輸出結果卻相反。實際第一個輸出結果為true,而第二個結果為fasle。這里面就是final變量和普通變量的區(qū)別了,當final變量是基本數(shù)據(jù)類型以及String類型時,如果在編譯期間能知道它的確切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變量的地方,相當于直接訪問的這個常量,不需要在運行時確定。因此在上面的一段代碼中,由于變量b被final修飾,因此會被當做編譯器常量,所以在使用到b的地方會直接將變量b替換為它的值。而對于變量d的訪問卻需要在運行時通過鏈接來進行。
在上面提到被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對象,那么該引用變量指向的對象的內容是否可變呢?下面通過實例驗證。
運行結果為:
由運行結果可知,final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對象,那么該引用變量指向的對象的內容是可變的。
總上所述,F(xiàn)inal關鍵字在修飾變量時,該變量就為常量,這是針對基本數(shù)據(jù)類型而言的,我們要區(qū)分及深入理解分析 final修飾引用類型數(shù)據(jù)時,其起的應用性能。另外,很多時候會容易把static和final關鍵字混淆,static作用于成員變量用來表示只保存一份副本,而 final的作用是用來保證變量不可變, final比static更加專一。
[1]http∶//www.cnblogs.com/beanmoon/archive/2012/04/25/2470298.html
[2] 安博教育集團,Java核心技術[M].北京:電子工業(yè)出版社,2012
[3] 高永強,Java編程藝術[M].北京:清華大學出版社,2009.
[4] 王善發(fā),吳道榮,Java編程中static和 final關鍵字的陷阱,保山學院學報,2012,31(5):19-22