鐘旭
摘 要:Java中的final關(guān)鍵字在面向?qū)ο缶幊讨衅鹬浅V匾饔茫梢杂糜谧兞?、方法以及?lèi),但是用得最多的是修飾變量。另外,final關(guān)鍵字經(jīng)常和static關(guān)鍵字一起使用來(lái)修飾變量,聲明該變量是常量。那么,final到底是如何來(lái)改善應(yīng)用性能的呢?本文將結(jié)合實(shí)例對(duì)final關(guān)鍵字修飾變量進(jìn)行深入剖析。
關(guān)鍵詞:final 基本數(shù)據(jù) 引用數(shù)據(jù) 面向?qū)ο?/p>
引言
final修飾的類(lèi)、變量和方法具有以下特性:
1.final修飾的類(lèi)不能被繼承。
2.final修飾的方法不能被子類(lèi)重寫(xiě)。
3.final修飾的變量(成員變量和局部變量)是常量,只能賦值
一次。
一、final修飾基本數(shù)據(jù)類(lèi)型與引用數(shù)據(jù)類(lèi)型的區(qū)別
修飾變量是final用得最多的地方,數(shù)據(jù)類(lèi)型有基本數(shù)據(jù)類(lèi)型與引用數(shù)據(jù)類(lèi)型,當(dāng)final修飾基本數(shù)據(jù)類(lèi)型時(shí),被修飾的數(shù)據(jù)就相當(dāng)于我們自己直接定義的常量,理解與應(yīng)用與一致,但當(dāng)修飾引用數(shù)據(jù)類(lèi)型變量時(shí),會(huì)有所不同,這是本文接下來(lái)要重點(diǎn)闡述的內(nèi)容。首先了解一下final變量的基本語(yǔ)法:對(duì)于一個(gè)final變量,如果是基本數(shù)據(jù)類(lèi)型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類(lèi)型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。 接下來(lái)舉個(gè)例子深入分析final關(guān)鍵字修飾引用類(lèi)型數(shù)據(jù)的性能:
class Test111 {
public static void main(String[] args) {
String as=”java2”;
final String ab=”java”;
String aa=”java”;
String w=ab+2;
String h=aa+2;
System.out.println((as==w));
System.out.println((as==h));
}}
上述代碼運(yùn)行結(jié)果為:
分析上述輸出結(jié)果可知,就final修飾基本數(shù)據(jù)而言,我們會(huì)得出第一個(gè)輸出結(jié)果應(yīng)該也是false,因?yàn)閒inal修飾變量時(shí),就相當(dāng)于常量。但輸出結(jié)果卻相反。實(shí)際第一個(gè)輸出結(jié)果為true,而第二個(gè)結(jié)果為fasle。這里面就是final變量和普通變量的區(qū)別了,當(dāng)final變量是基本數(shù)據(jù)類(lèi)型以及String類(lèi)型時(shí),如果在編譯期間能知道它的確切值,則編譯器會(huì)把它當(dāng)做編譯期常量使用。也就是說(shuō)在用到該final變量的地方,相當(dāng)于直接訪問(wèn)的這個(gè)常量,不需要在運(yùn)行時(shí)確定。因此在上面的一段代碼中,由于變量b被final修飾,因此會(huì)被當(dāng)做編譯器常量,所以在使用到b的地方會(huì)直接將變量b替換為它的值。而對(duì)于變量d的訪問(wèn)卻需要在運(yùn)行時(shí)通過(guò)鏈接來(lái)進(jìn)行。
二、final修飾引用類(lèi)型對(duì)像變量
在上面提到被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對(duì)象,那么該引用變量指向的對(duì)象的內(nèi)容是否可變呢?下面通過(guò)實(shí)例驗(yàn)證。
public class Test22 {
public static void main(String[] args) {
final Myclass dd=new Myclass();
System.out.println(++dd.i);
}}
class Myclass{
public int i=0;
}
運(yùn)行結(jié)果為:
由運(yùn)行結(jié)果可知,final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對(duì)象,那么該引用變量指向的對(duì)象的內(nèi)容是可變的。
結(jié)語(yǔ)
總上所述,F(xiàn)inal關(guān)鍵字在修飾變量時(shí),該變量就為常量,這是針對(duì)基本數(shù)據(jù)類(lèi)型而言的,我們要區(qū)分及深入理解分析final修飾引用類(lèi)型數(shù)據(jù)時(shí),其起的應(yīng)用性能。另外,很多時(shí)候會(huì)容易把static和final關(guān)鍵字混淆,static作用于成員變量用來(lái)表示只保存一份副本,而final的作用是用來(lái)保證變量不可變,final比static更加專(zhuān)一。
參考文獻(xiàn)
[1]http://www.cnblogs.com/beanmoon/archive/2012/04/25/2470298.html
[2] 安博教育集團(tuán),Java核心技術(shù)[M].北京:電子工業(yè)出版社,2012
[3] 高永強(qiáng),Java編程藝術(shù)[M].北京:清華大學(xué)出版社,2009.
[4] 王善發(fā),吳道榮,Java編程中static和final關(guān)鍵字的陷阱,保山學(xué)院學(xué)報(bào),2012,31(5):19-22