建立普通內部類物件與建立巢狀類物件的不同
阿新 • • 發佈:2018-12-26
為什麼需要使用內部類?
使用內部類的原因:每個內部類都能獨立的繼承自一個(介面的)實現,所以無論外部類是否已經繼承了某個(介面的)的實現,對內部類都沒有影響。實際上內部類有效的實現了“多重繼承”,就是說,內部類允許繼承多個非介面型別。
我們知道內部類自動擁有對外部類所有成員的訪問權,那麼這是如何做到的嗎?當某個外部類物件建立了一個內部類物件時,此內部類物件必定會祕密的捕獲一個指向那個外部類物件的引用。然後,在你訪問外部類的成員時,就是用那個引用來選擇外部類的成員。當然這些細節是編譯器處理,並且這裡的內部類是非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