//在方法中定義的內部類稱爲局部內部類。與局部變量相似,局部內部類不能有 訪問修飾符,由於它不是外圍類的一部分,可是它能夠訪問外圍類的全部成員《實例變量或類變量生命週期是類或對象,不是方法》
//方法內部類對象不能使用該內部類所在方法的非final局部變量。
//由於方法的局部變量位於棧上,只存在於該方法的生命期內。當一個方法結束,其棧結構被刪除,局部變量成爲歷史。
//可是該方法結束以後,在方法內建立的內部類對象可能仍然存在於堆中!例如,若是對它的引用被傳遞到其餘某些代碼,並存儲在一個成員變量內。
//正由於不能保證局部變量的存活期和方法內部類對象的同樣長,因此內部類對象不能使用非final修飾的局部變量。 this
//普通的內部類對象隱含地保存了一個引用,指向建立它的外圍類對象
public class InnerClass2 {
private int s = 100;
private int out_i = 1; spa
public void f(final int k) {
int i = 1; //局部變量 非final 局部內部類不可以使用
final int s = 200; //局部變量 局部內部類能夠使用
final int j = 10; //局部變量 局部內部類能夠使用 對象
// 定義在方法內部
class Inner {
//static int m = 20; //不能夠定義靜態變量
int s = 300; // 能夠定義與外部類同名的變量
int inner_i = 100;
Inner(int k) {
inner_f(k);
}
void inner_f(int k) {
int s = 500;
// 若是內部類沒有與外部類同名的變量,在內部類中能夠直接訪問外部類的實例變量
System.out.println(out_i);
// 能夠訪問外部類的局部變量(也就是方法內的局部變量),可是變量必須是final的
System.out.println(j);
//System.out.println(i);
//方法內局部變量 直接運用
System.out.println(s);
//若是內部類中有與外部類同名的變量,直接用變量名訪問的是內部類的變量
System.out.println(this.s);
// 用外部類名.this.內部類變量名訪問的是外部類變量
System.out.println(InnerClass2.this.s);
}
}
new Inner(k);
} 生命週期
public static void main(String[] args) {
// 訪問局部內部類必須先有外部類對象
InnerClass2 out = new InnerClass2();
out.f(3);
}
} class