標籤:
成員內部類的意思就是,一個外層類裡麵包含著一個非static的class,舉例如下:
class OuterClass{ //變數,函數定義。。。 class InnerClass { //變數,函數定義。。。 }}
關於成員內部類的各種使用方式:
1.成員內部類不能定義靜態成員,原因如下:
對於java類載入順序我們知道,首先載入類,執行static變數初始化,接下來執行對象的建立,如果我們要執行代碼中的變數i初始化,那麼必須先執行載入OuterClass,再載入InnerClass,最後初始化靜態變數i,問題就出在載入Innerclass上面,我們可以把InnerClass看成OuterClass的非靜態成員,它的初始化必須在外部類對象建立後以後進行,要載入InnerClass必須在執行個體化OuterClass之後完成 ,java虛擬機器要求所有的靜態變數必須在對象建立之前完成,這樣便產生了矛盾。也就是說,成員內部類是需要在外層類執行個體化之後,才能載入,其實成員內部類是屬於類對象,而不是屬於類,所以如果你InnerClass中如果有靜態成員,則OuterClass載入的時候,也必須載入了InnerClass,而此時沒有OuterClass執行個體對象,就不會有InnerClass。
2.當內部類和外部類具有同名成員(變數or函數,這裡指的是 非靜態)時:
如果要擷取InnerClass中的變數,直接使用變數名or方法名來調用;如果要調用OuterClass的同名成員,則通過“OuterClass.this.成員”,也就是“外層類.this.成員”。
3.當外部類有某一成員(變數or函數,靜態,非靜態都可以),但內部類沒有時:
在InnerClass調用OuterClass的成員,直接通過變數名or函數名調用即可。
4.當外部成員為靜態時(這裡不考慮內部類為靜態成員的情況,因為這篇文章僅涉及成員內部類的情況,且成員內部類不允許定義靜態成員):
當外部成員為靜態時,InnerClass直接通過變數名or函數名調用即可。
5.外部類,無法直接操作內部類的成員。
只能通過InnerClass的對象來調用,這裡沒有考慮InnerClass為靜態情況,(or沒有考慮InnerClass中的靜態方法,因為成員內部類不能有靜態成員)。
6.外部類的private成員,在內部類中的使用規則和以上五條一致。
7.如果涉及到繼承,也會將這個類繼承下來
class test{ public static void main(String[] args) { Human h=new Human(); Human.China hc=h.new China(); System.out.println(hc.cStr);//將會輸出China }}class Person{ public String pStr="Person"; class China { public String cStr="China"; }}class Human extends Person{ //其他屬性方法}
執行個體代碼:
class InnerClassTest { public static void main(String[] args) { OuterClass oc=new OuterClass(); OuterClass.InnerClass ic=oc.new InnerClass();//建立一個成員內部類的對象 OuterClass.InnerClass ic=new OuterClass().new InnerClass();//這樣建立一個成員內部類的對象,只是它屬於一個建立的OuterClass對象 System.out.println(ic.GetSamVar());//調用和內部類同名的變數 System.out.println(); System.out.println(ic.GetNotSameVarFromOuter());//調用外部類中沒有和內部類同名的變數 System.out.println(); System.out.println(ic.GetStaticVar());//調用外部類的靜態變數 System.out.println(); System.out.println(ic.CallOuterClassFunction());//調用外部類的非靜態方法 System.out.println(); System.out.println(ic.CallOuterClassStaticFunction());//調用外部類的靜態方法 System.out.println(); System.out.println(ic.CallOuterSameFunctionNameWithInner());//調用外部類中與內部類同名的非靜態方法 System.out.println(); System.out.println(ic.CallOuterClassStaticFunction());//調用外部類中的靜態方法 System.out.println(); }}//外部類class OuterClass{ int OuterInt=123; String OuterString="I am OuterClass‘s String"; String sameVar="I am the OuterClass‘s sameVar";//declare the same variable with the InnerClass.to show how to use the OuterClass and InnerClass var in the InnerClass static String staticVar="I am the OuterClass‘s staticVar"; //static String staticSameVar="I am the OuterClass‘s staticSameVar"; public String OuterClassFunction() { return "I am the OuterClass‘s function"; } public static String OuterClassStaticFunction() { return "I am the OuterClass‘s Static function"; } //與內部類同名的方法 public String SameFunction() { return "I am the OuterClass‘s function which has the same name with the InnerClass"; }
//內部類 class InnerClass { String sameVar="I am the OuterClass‘s sameVar"; //static String staticSameVar="I am the OuterClass‘s staticVar"; //與外部類同名的方法 public String SameFunction() { return "I am the InnerClass‘s function which has the same name with the OuterClass"; } //與外部類同名的變數 public String GetSamVar()//this function is to distinguish the same name variable with the OuterClass { //return sameVar; //得到內部類的變數 return OuterClass.this.sameVar;//get the OuterClass‘s sameVar } public String GetNotSameVarFromOuter()//Get the variable from outerclass ,and the variable is not in the innerclass { return OuterString; } public String GetStaticVar()//to show how to use the outerClass‘s static variable which not in the InnerClass { return staticVar; } public String CallOuterClassFunction()//調用外部類函數 { return OuterClass.this.OuterClassFunction(); } public String CallOuterClassStaticFunction() { return OuterClass.this.OuterClassStaticFunction(); //return OuterClass.OuterClassStaticFunction();//this two kinds of call ,are ok } public String CallOuterSameFunctionNameWithInner() { return OuterClass.this.SameFunction(); } }}
結果 所示:
各種情況應該都考慮到了,如果有其他情況,趕緊留言,我測試後,再繼續更新本文。如果有理解錯誤的地方,謝謝提出。。。
Java內部類——成員內部類