Java final關(guān)鍵字

在Java 中,final關(guān)鍵字可以修飾 類瘪弓,方法,和變量(包含成員變量和局部變量)禽最。

final 類

當(dāng)用final修飾一個(gè)類時(shí)腺怯,表明這個(gè)類不能被繼承。也就是說川无,如果一個(gè)類你永遠(yuǎn)不會(huì)讓他被繼承呛占,就可以用final進(jìn)行修飾。final類中的成員變量可以根據(jù)需要設(shè)為final懦趋,但是要注意final類中的所有成員方法都會(huì)被隱式地指定為final方法晾虑。

String 類就是final類。



final 方法

不允許子類重寫方法可以將方法聲明為final仅叫。

類的private 方法會(huì)隱式的指定為final帜篇。



final 變量

對(duì)于一個(gè)final變量,如果是基本數(shù)據(jù)類型的變量诫咱,則其數(shù)值一旦在初始化之后便不能更改笙隙;如果是引用類型的變量,則在對(duì)其初始化之后便不能再讓其指向另一個(gè)對(duì)象坎缭。

當(dāng)用final作用于類的成員變量時(shí)竟痰,成員變量(注意是類的成員變量,局部變量只需要保證在使用之前被初始化賦值即可)必須在定義時(shí)或者構(gòu)造器中進(jìn)行初始化賦值幻锁,而且final變量一旦被初始化賦值之后凯亮,就不能再被賦值了。

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));

}

}

大家可以先想一下這道題的輸出結(jié)果哄尔。為什么第一個(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í)確定。這種和C語言中的宏替換有點(diǎn)像创千。因此在上面的一段代碼中缰雇,由于變量b被final修飾,因此會(huì)被當(dāng)做編譯器常量追驴,所以在使用到b的地方會(huì)直接將變量b 替換為它的 值械哟。而對(duì)于變量d的訪問卻需要在運(yùn)行時(shí)通過鏈接來進(jìn)行。想必其中的區(qū)別大家應(yīng)該明白了殿雪,不過要注意暇咆,只有在編譯期間能確切知道final變量值的情況下,編譯器才會(huì)進(jìn)行這樣的優(yōu)化丙曙,比如下面的這段代碼就不會(huì)進(jìn)行優(yōu)化:

public class Test {

public static void main(String[] args)? {

String a ="hello2";

final String b = getHello();

String c = b +2;

System.out.println((a == c));

}

public static String getHello() {

return"hello";

}

}

這段代碼的輸出false


關(guān)于final參數(shù)


final

上面這段代碼好像讓人覺得用final修飾之后爸业,就不能在方法中更改變量i的值了。殊不知亏镰,方法changeValue和main方法中的變量i根本就不是一個(gè)變量扯旷,因?yàn)閖ava參數(shù)傳遞采用的是值傳遞,對(duì)于基本類型的變量拆挥,相當(dāng)于直接將變量進(jìn)行了拷貝薄霜。所以即使沒有final修飾的情況下,在方法內(nèi)部改變了變量i的值也不會(huì)影響方法外的i纸兔。


public class Test {

publicstaticvoidmain(String[] args)? {

MyClass myClass =new MyClass();

StringBuffer buffer =new StringBuffer("hello");

myClass.changeValue(buffer);

System.out.println(buffer.toString());

}

}

class MyClass {

void change Value(final StringBuffer buffer) {

buffer.append("world");

}

}

運(yùn)行這段代碼就會(huì)發(fā)現(xiàn)輸出結(jié)果為 helloworld惰瓜。很顯然,用final進(jìn)行修飾并沒有阻止在changeValue中改變buffer指向的對(duì)象的內(nèi)容汉矿。有人說假如把final去掉了崎坊,萬一在changeValue中讓buffer指向了其他對(duì)象怎么辦。有這種想法的朋友可以自己動(dòng)手寫代碼試一下這樣的結(jié)果是什么洲拇,如果把final去掉了奈揍,然后在changeValue中讓buffer指向了其他對(duì)象,也不會(huì)影響到main方法中的buffer赋续,原因在于java采用的是值傳遞男翰,對(duì)于引用變量,傳遞的是引用的值纽乱,也就是說讓實(shí)參和形參同時(shí)指向了同一個(gè)對(duì)象蛾绎,因此讓形參重新指向另一個(gè)對(duì)象對(duì)實(shí)參并沒有任何影響。


轉(zhuǎn)載:淺析Java中的final關(guān)鍵字 - 海 子 - 博客園

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市租冠,隨后出現(xiàn)的幾起案子鹏倘,更是在濱河造成了極大的恐慌,老刑警劉巖顽爹,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纤泵,死亡現(xiàn)場離奇詭異,居然都是意外死亡镜粤,警方通過查閱死者的電腦和手機(jī)捏题,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來繁仁,“玉大人涉馅,你說我怎么就攤上這事。” “怎么了庸诱?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桥爽。 經(jīng)常有香客問我,道長钠四,這世上最難降的妖魔是什么盗扒? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮缀去,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缕碎。我一直安慰自己,他們只是感情好咏雌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布凡怎。 她就那樣靜靜地躺著,像睡著了一般赊抖。 火紅的嫁衣襯著肌膚如雪统倒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天房匆,我揣著相機(jī)與錄音,去河邊找鬼坛缕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赚楚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宠页,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼举户!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起俭嘁,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拐云,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叉瘩,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡粘捎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了攒磨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡咧纠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漆羔,到底是詐尸還是另有隱情,我是刑警寧澤亲轨,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站鸟顺,受9級(jí)特大地震影響惦蚊,放射性物質(zhì)發(fā)生泄漏器虾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一兆沙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葛圃,春花似錦、人聲如沸库正。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抚垃。三九已至,卻和暖如春鹤树,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背魂迄。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工惋耙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绽榛。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像推溃,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子铁坎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容