定義在方法中的內部類固然是能夠訪問方法中的局部變量的,訪問的方法就是在局部變量上添加final關鍵字ui
(1)內部類是外部類的一個成員,就像外部類的成員方法同樣,因此內部類有權限訪問外部類的全部成員,包括private的。
(2)內部類不能訪問外部類方法中的局部變量,除非變量是final的(通常發生在方法中定義的內部類)。這是由於局部變量的生命週期緣由。this
class Outer{
private int a;
public class Inner{
private int a;
public void method(int a){
a++; //局部變量
this.a++; //Inner類變量
Outer.this.a++; //Outer類變量
}
}
}spa
通常作法是在Outer中寫一個返回Inner類對象的方法
public Inner getInner(){
return new Inner();
}.net
在其餘類中使用內部類:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
或者 Outer.Inner inner = outer.getInner();對象
static內部類的使用:
Outer.Inner inner = new Outer.Inner();blog
(1).所謂「局部內部類」就是在對象的方法成員內部定義的類。而方法中的類,訪問同一個方法中的局部變量,卻必需要加上一個final。
(2).緣由是編譯程序實現上的困難:內部類對象的生命週期會超過局部變量的生命期。局部變量的生命期:當該方法被調用時,該方法中的局部變量在棧中被建立,當方法調用結束時,退棧,這些局部變量所有死亡。而內部類對象生命期,與其它類同樣,當建立一個局部內部類對象後,只有當沒有其它人再引用它時,它才能死亡。因此徹底可能一個方法已調用結束(局部變量已死亡),但該局部類的對象仍然活着。即:局部類的對象生命期會超過局部變量。
(3).局部內部類的對象訪問同一個方法中的局部變量,那麼這就要求只要局部內部類對象還活着,那麼棧中的那些它要訪問的局部變量就不能「死亡」(不然:它都死了,還訪問個什麼呢?)。這就是說:局部變量的生命期至少等於或大於局部內部類對象的生命期。
(4).解決方法:局部內部類的對象能夠訪問同一個方法中被定義爲final的局部變量。定義爲final後,編譯程序的實現方法:將全部的局部內部類對象要訪問的final型局部變量,都拷貝成爲該內部類對象中的一個數據成員。這樣,即便棧中局部變量(含final)已死亡,但因爲它是final,其值永不變,於是局部內部類對象在變量死亡後,照樣能夠訪問final型局部變量。(這一點我有些懷疑)
(5).概括總結:局部內部類對象中包含有要訪問的final型局部變量的一個拷貝,成爲它的數據成員。所以,正是在這個意義上,final型局部變量的生命期,超過其方法的一次調用。嚴格來講,方法調用結束,全部的局部變量(含final)全死亡了。但:局部內部類對象中有final型局部變量的拷貝。生命週期
參考:http://blog.csdn.net/zhangjg_blog/article/details/19996629get