鐘旭
摘 要:Java中的final關(guān)鍵字在面向?qū)ο缶幊讨衅鹬浅V匾饔?,它可以用于變量、方法以及類,但是用得最多的是修飾變量。另外,final關(guān)鍵字經(jīng)常和static關(guān)鍵字一起使用來修飾變量,聲明該變量是常量。那么,final到底是如何來改善應(yīng)用性能的呢?本文將結(jié)合實(shí)例對final關(guān)鍵字修飾變量進(jìn)行深入剖析。
關(guān)鍵詞:final 基本數(shù)據(jù) 引用數(shù)據(jù) 面向?qū)ο?/p>
引言
final修飾的類、變量和方法具有以下特性:
1.final修飾的類不能被繼承。
2.final修飾的方法不能被子類重寫。
3.final修飾的變量(成員變量和局部變量)是常量,只能賦值
一次。
一、final修飾基本數(shù)據(jù)類型與引用數(shù)據(jù)類型的區(qū)別
修飾變量是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變量的基本語法:對于一個(gè)final變量,如果是基本數(shù)據(jù)類型的變量,則其數(shù)值一旦在初始化之后便不能更改;如果是引用類型的變量,則在對其初始化之后便不能再讓其指向另一個(gè)對象。 接下來舉個(gè)例子深入分析final關(guān)鍵字修飾引用類型數(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ù)類型以及String類型時(shí),如果在編譯期間能知道它的確切值,則編譯器會(huì)把它當(dāng)做編譯期常量使用。也就是說在用到該final變量的地方,相當(dāng)于直接訪問的這個(gè)常量,不需要在運(yùn)行時(shí)確定。因此在上面的一段代碼中,由于變量b被final修飾,因此會(huì)被當(dāng)做編譯器常量,所以在使用到b的地方會(huì)直接將變量b替換為它的值。而對于變量d的訪問卻需要在運(yùn)行時(shí)通過鏈接來進(jìn)行。
二、final修飾引用類型對像變量
在上面提到被final修飾的引用變量一旦初始化賦值之后就不能再指向其他的對象,那么該引用變量指向的對象的內(nèi)容是否可變呢?下面通過實(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修飾的引用變量一旦初始化賦值之后就不能再指向其他的對象,那么該引用變量指向的對象的內(nèi)容是可變的。
結(jié)語
總上所述,F(xiàn)inal關(guān)鍵字在修飾變量時(shí),該變量就為常量,這是針對基本數(shù)據(jù)類型而言的,我們要區(qū)分及深入理解分析final修飾引用類型數(shù)據(jù)時(shí),其起的應(yīng)用性能。另外,很多時(shí)候會(huì)容易把static和final關(guān)鍵字混淆,static作用于成員變量用來表示只保存一份副本,而final的作用是用來保證變量不可變,final比static更加專一。
參考文獻(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