1. 程式人生 > >《Java程式設計思想》讀書筆記——內部類(一)

《Java程式設計思想》讀書筆記——內部類(一)

內部類擁有其外圍所有(即使是私有)屬性的訪問權。

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

上例中,我們在內部類Innerf()方法中,成功地訪問了外部類的私有屬性並呼叫了外部類的私有方法。

內部類自動擁有對其外部類所有成員的訪問權。這是如何做到的呢?當某個外圍類的物件建立了一個內部類物件時,此內部類物件必定會祕密地捕獲一個指向那個外圍物件的引用。然後,再你訪問此外圍類的成員時,就是用那個引用來選擇外圍類的成員。幸運的是,編譯器會幫你處理所有的細節,但你現在可以看到:內部類的物件只能再與其外部類的物件相關聯的情況下才能被建立(就像你應該看到,在內部類是非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確實指向同一個物件。