(1)內部類是外部類的一個成員,就像外部類的成員方法一樣,所以內部類有權限訪問外部類的所有成員,包括private的。
(2)內部類不能訪問外部類方法中的局部變量,除非變量是final的(一般發生在方法中定義的內部類)。這是因為局部變量的生命周期原因。
class Outer{
private int a;
public class Inner{
private int a;
public void method(int a){
a++; //局部變量
this.a++; //Inner類變量
Outer.this.a++; //Outer類變量
}
}
}
一般做法是在Outer中寫一個返回Inner類對象的方法
public Inner getInner(){
return new Inner();
} 在其他類中使用內部類:
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner(); 或者 Outer.Inner inner = outer.getInner();
static內部類的使用: Outer.Inner inner = new Outer.Inner();
(1).所謂“局部內部類”就是在對象的方法成員內部定義的類。而方法中的類,訪問同一個方法中的局部變量,卻必須要加上一個final。
(2).原因是編譯程序實現上的困難:內部類對象的生命周期會超過局部變量的生命期。局部變量的生命期:當該方法被調用時,該方法中的局部變量在棧中被創建,當方法調用結束時,退棧,這些局部變量全部死亡。而內部類對象生命期,與其它類一樣,當創建一個局部內部類對象后,只有當沒有其它人再引用它時,它才能死亡。所以完全可能一個方法已調用結束(局部變量已死亡),但該局部類的對象仍然活着。即:局部類的對象生命期會超過局部變量。
(3).局部內部類的對象訪問同一個方法中的局部變量,那么這就要求只要局部內部類對象還活着,那么棧中的那些它要訪問的局部變量就不能“死亡”(否則:它都死了,還訪問個什么呢?)。這就是說:局部變量的生命期至少等於或大於局部內部類對象的生命期。
(4).解決方法:局部內部類的對象可以訪問同一個方法中被定義為final的局部變量。定義為final后,編譯程序的實現方法:將所有的局部內部類對象要訪問的final型局部變量,都拷貝成為該內部類對象中的一個數據成員。這樣,即使棧中局部變量(含final)已死亡,但由於它是final,其值永不變,因而局部內部類對象在變量死亡后,照樣可以訪問final型局部變量。(這一點我有些懷疑)
(5).歸納總結:局部內部類對象中包含有要訪問的final型局部變量的一個拷貝,成為它的數據成員。因此,正是在這個意義上,final型局部變量的生命期,超過其方法的一次調用。嚴格來說,方法調用結束,所有的局部變量(含final)全死亡了。但:局部內部類對象中有final型局部變量的拷貝。
final 補充說明:
1.在java中聲明類、屬性、方法時,可使用關鍵字final來修飾
2.final標記的類不能被繼承。
3.final標記的方法不能被子類重寫
4.final標記的變量(成員變量或局部變量)即成為常量,只能賦值一次。
5.final標記的變量必須在聲明的同時或在構造方法中顯示賦值,然后才能使用。
final int x = 5;
class Test{
final int x ;
Test(){
x=3;
} }