1)所謂“局部內(nèi)部類”就是在對象的方法成員內(nèi)部定義的類,。而方法中的類,,訪問同一個方法中的局部變量,是天經(jīng)地義的,。那么為什么要加上一個final呢,?
2)原因是:編譯程序?qū)崿F(xiàn)上的困難,難在何處:內(nèi)部類對象的生命周期會超過局部變量的生命期,。為什么,?表現(xiàn)在:局部變量的生命期:當(dāng)該方法被調(diào)用時,該方法中的局部變量在棧中被創(chuàng)建(誕生),,當(dāng)方法調(diào)用結(jié)束時(執(zhí)行完畢),,退棧,這些局部變量全部死亡,。而:內(nèi)部類對象生命期,,與其它類一樣,當(dāng)創(chuàng)建一個該局部類對象后,,只有沒有其它人再引用它時,,它才能死亡。完全可能:一個方法已調(diào)用結(jié)束(局部變量已死亡),,但該局部類的對象仍然活著,。即:局部類的對象生命期會超過局部變量。
3)退一萬步:局部類的對象生命期會超過局部變量又怎樣,?問題的真正核心是:如果:局部內(nèi)部類的對象訪問同一個方法中的局部變量,,是天經(jīng)地義的,那么:只要局部內(nèi)部類對象還活著,,則:棧中的那些它要訪問的局部變量就不能“死亡”(否則:它都死了,,還訪問個什么呢?),,這就是說:局部變量的生命期至少等于或大于局部內(nèi)部類對象的生命期,。而:正是這一點是不可能做到的
4)但是從理論上:局部內(nèi)部類的對象訪問同一個方法中的局部變量,是天經(jīng)地義的,。所以:經(jīng)過努力,,達(dá)到一個折中結(jié)果:即:局部內(nèi)部類的對象可以訪問同一個方法中的局部變量,,只要這個變量被定義為final.那么:為什么定義為final變可以呢?定義為final后,,編譯程序就好實現(xiàn)了:具體實現(xiàn)方法是:將所有的局部內(nèi)部類對象要訪問的final型局部變量,,變成該內(nèi)部類對象中的一個數(shù)據(jù)成員。這樣,,即使棧中局部變量(含final)已死亡,,但由于它是final,其值永不變,因而局部內(nèi)部類對象在變量死亡后,,照樣可以訪問final型局部變量,。
歸納上述回答的真正核心是:局部內(nèi)部類對象中包含有要訪問的final型局部變量的一個拷貝,成為它的數(shù)據(jù)成員,。因此,,正是在這個意義上,final型局部變量的生命期,,超過其方法的一次調(diào)用。嚴(yán)格來說,,方法調(diào)用結(jié)束,,所有的局部變量(含final)全死亡了。但:局部內(nèi)部類對象中有final型局部變量的拷貝,。
其他:
不管對象是不是final,,他的生命周期都是 new開始,垃圾回收結(jié)束,。
不管變量是不是final,,他的生命周期都在于{}中。
類對象(class對象)與其它對象不同,,類對象的生命周期 開始于類被加到內(nèi)存中那一刻,,結(jié)束于垃圾回收。
類變量(static)與類對象的生命周期相同,。