(長沙學(xué)院計(jì)算機(jī)工程與應(yīng)用數(shù)學(xué)學(xué)院 湖南長沙 410075)
final修飾的類、變量和方法具有以下特性:
1. final修飾的類不能被繼承。
2. final修飾的方法不能被子類重寫。
3. final修飾的變量(成員變量和局部變量)是常量,只能賦值一次。
修飾變量是final用得最多的地方,數(shù)據(jù)類型有基本數(shù)據(jù)類型與引用數(shù)據(jù)類型,當(dāng)final修飾基本數(shù)據(jù)類型時(shí),被修飾的數(shù)據(jù)就相當(dāng)于我們自己直接定義的常量,理解與應(yīng)用與一致,但當(dāng)修飾引用數(shù)據(jù)類型變量時(shí),會(huì)有所不同,這是本文接下來要重點(diǎn)闡述的內(nèi)容。首先了解一下final變量的基本語法:對(duì)于一個(gè)final變量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象。 接下來舉個(gè)例子深入分析final關(guān)鍵字修飾引用類型數(shù)據(jù)的性能:
上述代碼運(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ù)類型以及String類型時(shí),如果在編譯期間能知道它的確切值,則編譯器會(huì)把它當(dāng)做編譯期常量使用。也就是說在用到該final變量的地方,相當(dāng)于直接訪問的這個(gè)常量,不需要在運(yùn)行時(shí)確定。因此在上面的一段代碼中,由于變量b被final修飾,因此會(huì)被當(dāng)做編譯器常量,所以在使用到b的地方會(huì)直接將變量b替換為它的值。而對(duì)于變量d的訪問卻需要在運(yùn)行時(shí)通過鏈接來進(jìn)行。
在上面提到被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對(duì)象,那么該引用變量指向的對(duì)象的內(nèi)容是否可變呢?下面通過實(shí)例驗(yàn)證。
運(yùn)行結(jié)果為:
由運(yùn)行結(jié)果可知,final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對(duì)象,那么該引用變量指向的對(duì)象的內(nèi)容是可變的。
總上所述,F(xiàn)inal關(guān)鍵字在修飾變量時(shí),該變量就為常量,這是針對(duì)基本數(shù)據(jù)類型而言的,我們要區(qū)分及深入理解分析 final修飾引用類型數(shù)據(jù)時(shí),其起的應(yīng)用性能。另外,很多時(shí)候會(huì)容易把static和final關(guān)鍵字混淆,static作用于成員變量用來表示只保存一份副本,而 final的作用是用來保證變量不可變, final比static更加專一。
[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