《Java程式設計思想》讀書筆記——內部類(一)
阿新 • • 發佈:2019-02-16
內部類擁有其外圍所有(即使是私有)屬性的訪問權。
public class Outer {
private String s = "hello";
private void add(){
System.out.println(s + " world");
}
class Inner{
public void f() {
System.out.println(s);
add();
}
}
public static void main(String[ ] args) {
Outer out = new Outer();
Inner in = out.new Inner();
in.f();
}
}
執行結果:
hello
hello world
上例中,我們在內部類Inner
的f()
方法中,成功地訪問了外部類的私有屬性並呼叫了外部類的私有方法。
內部類自動擁有對其外部類所有成員的訪問權。這是如何做到的呢?當某個外圍類的物件建立了一個內部類物件時,此內部類物件必定會祕密地捕獲一個指向那個外圍物件的引用。然後,再你訪問此外圍類的成員時,就是用那個引用來選擇外圍類的成員。幸運的是,編譯器會幫你處理所有的細節,但你現在可以看到:內部類的物件只能再與其外部類的物件相關聯的情況下才能被建立(就像你應該看到,在內部類是非static類時)。構建內部類物件時,需要一個指向其外圍物件的引用,如果編譯器訪問不到這個引用就會報錯。
內部類通過.this
獲得對外部類物件的引用,通過.new
建立內部類物件
public class Outer {
class Inner{
public Outer f() {
Outer out = Outer.this;
return out;
}
}
public static void main(String[] args) {
Outer out = new Outer();
Inner in = out.new Inner();
Outer out2 = in.f();
System.out.println("out與out2指向同一個物件?" + (out == out2));
}
}
執行結果:
out與out2指向同一個物件?true
在main()
方法中,我們新建了一個外部類物件,並通過.new
的方式新建了它的一個內部類物件,然後呼叫內部類的f()
方法。內部類的f()
方法通過.this
的方式獲得外部類的引用。最終,我們利用==
操作符證明,我們新建的外部類引用out
與獲得的引用out2
確實指向同一個物件。