Java 局部?jī)?nèi)部類(lèi)訪問(wèn)它所在方法的局部變量時(shí)威酒,要求該局部變量必須聲明為final的原因

這是java的一條規(guī)則窑睁。那么為什么會(huì)有這條規(guī)則呢?要想弄懂這個(gè)問(wèn)題葵孤,就需要弄懂局部?jī)?nèi)部類(lèi)對(duì)象和局部變量的生命周期誰(shuí)更長(zhǎng)的問(wèn)題担钮。

首先,看一段代碼尤仍,以沒(méi)有將變量聲明為final的代碼作為例子箫津,代碼如下:

class Outer{
    
    Object obj;
    public void outerMethod() {
        
        //局部變量
        int x = 5;
        //定義在方法中的內(nèi)部類(lèi)稱(chēng)為局部?jī)?nèi)部類(lèi)
        class Inner{

            public String toString() {
                System.out.println(x);//訪問(wèn)了局部變量x
            return null; 
            }
        }
        //創(chuàng)建內(nèi)部類(lèi)實(shí)例
        Inner in = new Inner();
        in.toString();
        //將內(nèi)部類(lèi)實(shí)例的引用賦值給obj
        obj = in;
    }
}
public class HelloDemo {
    
    public static void main(String[] argr) {
        Outer out = new Outer();
        out.outerMethod();
      
  }
}

如上面的第7行代碼所示,變量x沒(méi)有被聲明為final宰啦,如果是這樣的話苏遥,當(dāng)執(zhí)行完第26行的outMethod()方法后,outMethod()方法將出棧赡模,出棧后outMethod()方法里面定義的所有變量(x 和 in)都死亡了田炭,(但是此時(shí)內(nèi)部類(lèi)的對(duì)象還活著,直到它不再被使用才會(huì)被回收漓柑,也就是說(shuō)此內(nèi)部類(lèi)對(duì)象的生命周期比局部變量的生命周期長(zhǎng))教硫,并且在變量 in 死亡之前叨吮,in 的值賦值給了成員變量obj(第19行代碼),這時(shí)obj 指向了內(nèi)部類(lèi)的對(duì)象瞬矩,如果此時(shí)在27行執(zhí)行一條代碼: out.obj.toString();那么這條代碼將會(huì)訪問(wèn)到局部變量 x茶鉴,但是此時(shí) x 已經(jīng)死亡了,內(nèi)部類(lèi)對(duì)象已經(jīng)訪問(wèn)不到 x 了丧鸯,因此這是相互矛盾的蛤铜。所以上面的代碼實(shí)際上并不能編譯通過(guò)。(在jdk8.0能編譯通過(guò)丛肢,那是因?yàn)樗鼨z測(cè)到局部?jī)?nèi)部類(lèi)訪問(wèn)了 x围肥,會(huì)默認(rèn)給 x 的前面加上隱式的final,如果在第8行加上一句代碼:x = 4蜂怎;編譯器將會(huì)報(bào)錯(cuò)穆刻,因?yàn)閒inal不允許 x 的值改變)

如果局部變量 x 被聲明為final后(在第七行的int前加上final),x 就代表了一個(gè)常量杠步,那么第15行的代碼實(shí)際上就變成了 System.out.println(5);氢伟,這時(shí)內(nèi)部類(lèi)相當(dāng)于訪問(wèn)了一個(gè)數(shù)字5。這是沒(méi)任何問(wèn)題的幽歼,因此局部?jī)?nèi)部類(lèi)訪問(wèn)它所在方法的局部變量時(shí)朵锣,要求該局部變量必須聲明為final。究其根本原因甸私,是局部?jī)?nèi)部類(lèi)對(duì)象的生命周期比局部變量的生命周期長(zhǎng)诚些。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市皇型,隨后出現(xiàn)的幾起案子诬烹,更是在濱河造成了極大的恐慌,老刑警劉巖弃鸦,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绞吁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡唬格,警方通過(guò)查閱死者的電腦和手機(jī)家破,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)西轩,“玉大人员舵,你說(shuō)我怎么就攤上這事∨号希” “怎么了马僻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)注服。 經(jīng)常有香客問(wèn)我措近,道長(zhǎng)女淑,這世上最難降的妖魔是什么瞭郑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任鸭你,我火速辦了婚禮屈张,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘袱巨。我一直安慰自己,他們只是感情好愉老,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著嫉入,像睡著了一般焰盗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咒林,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天熬拒,我揣著相機(jī)與錄音垫竞,去河邊找鬼梦湘。 笑死件甥,一個(gè)胖子當(dāng)著我的面吹牛哼拔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播倦逐,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼檬姥!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起抒巢,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤秉犹,失蹤者是張志新(化名)和其女友劉穎稚晚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體客燕,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狰贯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涵紊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拍顷,死狀恐怖塘幅,靈堂內(nèi)的尸體忽然破棺而出昔案,到底是詐尸還是另有隱情电媳,我是刑警寧澤踏揣,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布匾乓,位于F島的核電站,受9級(jí)特大地震影響娱局,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜衰齐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一继阻、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瘟檩,春花似錦、人聲如沸墨辛。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哮幢。三九已至志珍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伦糯,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工喂击, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翰绊。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓旁壮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親抡谐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法刽肠,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法音五,繼承相關(guān)的語(yǔ)法羔沙,異常的語(yǔ)法放仗,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,631評(píng)論 18 399
  • 整理來(lái)自互聯(lián)網(wǎng) 1撬碟,JDK:Java Development Kit莉撇,java的開(kāi)發(fā)和運(yùn)行環(huán)境,java的開(kāi)發(fā)工具...
    Ncompass閱讀 1,538評(píng)論 0 6
  • 這個(gè)周末我去了我的老家三門(mén)棍郎,開(kāi)啟了一趟海邊之旅。 我們到三門(mén)的時(shí)候已經(jīng)是十點(diǎn)了涂佃,因?yàn)椴幌氪驍_外公外...
    竹青奶茶閱讀 391評(píng)論 1 1
  • 我是一名醫(yī)生蜈敢!
    346cde2e3dc7閱讀 206評(píng)論 0 0
  • 對(duì)有些人的善良就是對(duì)自己的殘忍抓狭。
    青山有木閱讀 77評(píng)論 0 0