1. 程式人生 > >建立普通內部類物件與建立巢狀類物件的不同

建立普通內部類物件與建立巢狀類物件的不同

為什麼需要使用內部類?
使用內部類的原因:每個內部類都能獨立的繼承自一個(介面的)實現,所以無論外部類是否已經繼承了某個(介面的)的實現,對內部類都沒有影響。實際上內部類有效的實現了“多重繼承”,就是說,內部類允許繼承多個非介面型別。

我們知道內部類自動擁有對外部類所有成員的訪問權,那麼這是如何做到的嗎?當某個外部類物件建立了一個內部類物件時,此內部類物件必定會祕密的捕獲一個指向那個外部類物件的引用。然後,在你訪問外部類的成員時,就是用那個引用來選擇外部類的成員。當然這些細節是編譯器處理,並且這裡的內部類是非static的。
要建立內部類的物件,不是按照本來想的方式,去引用外部類的名字DotNew,而是必須使用外部類的物件來建立內部類的物件。如下面的例子:
public class DotNew{
public class Inner{
}
public static void main(String[] args){
DotNew dn =new DotNew();
DotNew.Inner dni=dn.new Inner();
}
}
但是,如果你建立的是巢狀類(靜態內部類),那麼就不需要外部類物件引用,如下面的例子:

package innerclassdotnew;

public class InnerDotNew {

InnerDotNew(){
    System.out.println("InnerDotNew");
}

static class StaticInner{
    StaticInner(){
        System.out.println("static inner class");
    }
}
class Inner{
    Inner(){
        System.out.println("normal Inner class");
    }
}

public static void main(String[] args){
    InnerDotNew idn=new InnerDotNew();
    InnerDotNew.Inner dnInner=idn.new Inner();
    /*compile error:
    No enclosing instance of type InnerDotNew is accessible. 
    Must qualify the allocation with an enclosing instance of type InnerDotNew 
    (e.g. x.new A() where x is an instance of InnerDotNew).*/
    //InnerDotNew.Inner dnInner=new Inner();
    InnerDotNew.StaticInner staticInner =new StaticInner();
}

}
/*output/
InnerDotNew
normal Inner class
static inner class