第十四天(內部類)

来源:互联网 发布:手机淘宝系统异常 编辑:程序博客网 时间:2024/05/16 00:42

昨日寫完筆記,發現已過十一點半。補之。

2011-06-08(Inner Class)
1、在外部類之內創建內部類對象。用new操作,之後直接可使用內部類對象的引用調用內部類成員。注意的是,對於非靜態內部類不能再靜態上下文中使用。
2、在外部類之外創建內部類對象。非靜態內部類是外部類的成員,需要創建外部類成員后才能調用(就是創建外部引用后通過此引用創建內部):
                              <外部類類名>.<內部類類名> 引用變量=<外部類對象引用>.new <內部類構造器>;
                              <外部類類名>.<內部類類名> 引用變量=new <外部類構造器>。new 內部類構造器;
3、成員互訪。
I、內部類訪問外部類成員。內部類作為外部類的成員,所以在內部類中可以使用外部類成員,包括被標識為private的成員。
II、外部類訪問內部類成員。外部類可以在創建內部類對象后訪問內部類成員,包括私有的內部類成員。注意的是,內部類不能有靜態成員。
4、this的使用。this是指向當前對象的引用,可用用來區別局部與成員變量。但在內部類中,使用外部類中與內部類同名的變量是時,單靠this是不行的,因為this此時是指向內部類對象的。用語法:
 <外部類名>.this.<外部類成員> 結果:先後輸出100,50。
5、局部內部類。①局部內部類可以訪問外部類成員;②在靜態方法中局部內部類只能訪問外部靜態成員;③如果局部內部類想訪問局部變量,這個變量必須是final型。 嘗試編譯,不能通過。第3行改為final int x=50,才能編譯通過運行。爲什麽要final型呢?
(1)局部變量隨著所在語句塊地執行結束而消亡,而局部內部類所創建的對象是實際存在的,創建之後不會消失。因此會造成局部變量消失,而局部內部類訪問的矛盾局面。
(2)final與局部變量不同,不會隨語句結束而消失,繼續存在。
6、創建靜態內部類對象。靜態成員屬於外部類,創建之時不需先創建外部類對象,直接:
<外部類名>.<內部類名> 引用變量=new <外部類名>.<內部類構造器>;
當然,這個語法只用與外部類之外創建內部對象是使用,內部類之內與創建非靜態內部類對象是一樣,即:
                                                 在外部類外:Outter.Inner in=new Outter.Inner();
                                                 在外部類內:Inner in=new Inner();
7、靜態內部類亦可稱為:靜態嵌套類、頂級嵌套類。其原因是:靜態的內部類已經脫離了外部類的控制,實質只是放置在別的類中的普通類。關鍵字static只是說明在創建對象是不依賴與外部類對象的存在,并不是說這個類本身是靜態的。
8、匿名內部類無名稱,在聲明的同時創建了對象。聲明的過程要麼基於繼承、要麼基於實現接口,也就說不能繼承某個類的同時實現接口。
I、基於繼承。語法為:
                                             new <匿名內部類要繼承的父類的構造器>{/*類體*/};
匿名內部類無類名,所以不需編寫構造器;繼承后,可以重寫父類的方法,也可創建新的方法和成員。因為匿名內部類沒有名字,無法聲明內部類類型的引用,也就無法調用新聲明的方法和成員。如語句:
                                                    SuperClass sc=new SuperClass(){
                                                    //...
                                                    };
之後可以通過父類類型引用sc來調用內部類中重寫父類的方法。
II、實現接口。語法為:
                                                       new <接口名>(){/*類體*/};
內部類必須實現接口中的所有方法,也是不能調用新增的內部成員。
9、匿名內部類的初始化。匿名內部類無類名,無法為其編寫構造器,也即無法為內部類對象的初始化。可以非靜態語句塊代替構造器功能。
10、匿名內部類的優勢。匿名只能創建一個對象,且只能通過多態來使用,不方便。優勢在哪?優勢恰恰在於它只能創建一個對象,因為某些是時候是只需要一份對象。而創建一個對象所需的代碼是很少的。如
                                          TreeSet ts=new TrssSet(new Comparator(){ 
                                         public int compare(Object o1,Object o2){/*實現compare方法*/}
                                          });
這裡直接在TreeSet構造函數中創建一個匿名內部類,這個匿名內部類實現了Comparator接口,并創建了一個對象。這樣不需單獨的再編寫一個實現Comparator的類,減少了代碼量。
11、內部接口。 結果:
                                                                   Implementing in class A
                                                                   Implementing in class B
①9行,類B可以用語句A.AInnterface來調用內部接口,說明內部接口必為static;
②2行,改為private,9、18行報錯,說明內部接口只能用於外部類內實現,並且,外部類了如果想調用實現內部接口的內部類,不能用內部接口引用類型。即,改16行為A.AInnerInterface ai=a.new AInnerClass();后,當為public是不報錯,改為private后就會報16行的錯;
③沒有局部內部接口。

原创粉丝点击