leochiang

          BlogJava 聯(lián)系 聚合 管理
            21 Posts :: 0 Stories :: 1 Comments :: 0 Trackbacks
              java內(nèi)部類分為:成員內(nèi)部類,局部內(nèi)部類,靜態(tài)內(nèi)部類,匿名內(nèi)部類。
          1) 成員內(nèi)部類:
                  什么是成員內(nèi)部類:作為外部類的成員存在,與外部類的屬性和方法并列。注意:成員內(nèi)部類中不能定義靜態(tài)變量,但是可以訪問外部類的所有成員。
                    成員內(nèi)部類的用處:   見最后的內(nèi)部類作用。   
                  成員內(nèi)部類的優(yōu)點(diǎn): 1.內(nèi)部類作為外部類的成員可以訪問外部類的所有成員包括私有成員或?qū)傩浴?.用內(nèi)部類定義在外部類中不可訪問的屬性。這樣就在外部類中實現(xiàn)了比外部類的private還要小的訪問權(quán)限。
                  成員內(nèi)部類注意:內(nèi)部類是一個編譯時的概念,一旦編譯成功,就會成為完全不同的兩類。對于一個名為outer的外部類和其內(nèi)部定義的名為inner的內(nèi)部類。編譯完成后出現(xiàn)outer.class和outer$inner.class兩類。
           
           public class Outer{
          private static int i = 1;
          private int j=10;
          private int k=20;
          public static void outer_f1(){
              //do more something
              System.out.println("outer's outer_f1");
          }
          public void out_f2(){
              //do more something
              
              
          }

          //成員內(nèi)部類
          class Inner{
          //static int inner_i =100; //內(nèi)部類中不允許定義靜態(tài)變量
          int j=100;//內(nèi)部類中外部類的實例變量可以共存
          int inner_i=1;
          void inner_f1(){
              System.out.println(i);//外部類的變量如果和內(nèi)部類的變量沒有同名的,則可以直接用變量名訪問外部類的變量
              System.out.println(j);//在內(nèi)部類中訪問內(nèi)部類自己的變量直接用變量名
              System.out.println(this.j);//也可以在內(nèi)部類中用"this.變量名"來訪問內(nèi)部類變量
              
          //訪問外部類中與內(nèi)部類同名的實例變量可用"外部類名.this.變量名"。
              System.out.println(k);//外部類的變量如果和內(nèi)部類的變量沒有同名的,則可以直接用變量名訪問外部類的變量
              
              outer_f1(); //可以直接訪問外部類的靜態(tài)方法
          //    outer_f2(); //compile error,訪問外部類非靜態(tài)方法,必須使用外部類的實例,如下一句
              Outer.this.out_f2();


          }
          //外部類的非靜態(tài)方法訪問成員內(nèi)部類
          public void outer_f3(){
              Inner inner = new Inner();
              inner.inner_f1();
          }

          //外部類的靜態(tài)方法訪問成員內(nèi)部類,與在外部類外部訪問成員內(nèi)部類一樣
          public static void outer_f4(){
              //step1 建立外部類對象
              Outer out = new Outer();
              //***step2 根據(jù)外部類對象建立內(nèi)部類對象***
              Inner inner=out.new Inner();
              //step3 訪問內(nèi)部類的方法
              inner.inner_f1();
          }

          public static void main(String[] args){
              outer_f4();
          }
          }
          2) 局部內(nèi)部類:
                  什么是局部內(nèi)部類: 即在方法中定義的內(nèi)部類,與局部變量類似,在局部內(nèi)部類前不加修飾符public或private,其范圍為定義它的代碼塊。 
                  局部內(nèi)部類的用處:   見最后的內(nèi)部類作用。  
                  局部內(nèi)部類的優(yōu)點(diǎn):在類外不可直接生成局部內(nèi)部類(保證局部內(nèi)部類對外是不可見的)。要想使用局部內(nèi)部類時需要生成對象,對象調(diào)用方法,在方法中才能調(diào)用其局部內(nèi)部類。通過內(nèi)部類和接口達(dá)到一個強(qiáng)制的弱耦合,用局部內(nèi)部類來實現(xiàn)接口,并在方法中返回接口類型,使局部內(nèi)部類不可見,屏蔽實現(xiàn)類的可見性。  
                 局部內(nèi)部類注意:局部內(nèi)部類中不可定義靜態(tài)變量,可以訪問外部類的局部變量(即方法內(nèi)的變量),但是變量必須是final的。  
          public class Outer {
              private int s = 100;
              private int out_i = 1;

              public void f(final int k) {
                  final int s = 200;
                  int i = 1;
                  final int j = 10;
                  class Inner { // 定義在方法內(nèi)部
                      int s = 300;// 可以定義與外部類同名的變量

                      
          // static int m = 20;//不可以定義靜態(tài)變量
                      Inner(int k) {
                          inner_f(k);
                      }

                      int inner_i = 100;

                      void inner_f(int k) {
                          System.out.println(out_i);// 如果內(nèi)部類沒有與外部類同名的變量,在內(nèi)部類中可以直接訪問外部類的實例變量
                          System.out.println(k);// *****可以訪問外部類的局部變量(即方法內(nèi)的變量),但是變量必須是final的*****
          //                 System.out.println(i);  //compile error,i必須是final的
                          System.out.println(s);// 如果內(nèi)部類中有與外部類同名的變量,直接用變量名訪問的是內(nèi)部類的變量
                          System.out.println(this.s);// 用"this.變量名" 訪問的也是內(nèi)部類變量
                          System.out.println(Outer.this.s);// 用外部"外部類類名.this.變量名"
                                                              
          // 訪問的是外部類變量
                      }
                  } //inner
                  new Inner(k);
              }

              public static void main(String[] args) {
                  // 訪問局部內(nèi)部類必須先有外部類對象
                  Outer out = new Outer();
                  out.f(3);
              }

          }
            
          3)靜態(tài)內(nèi)部類:
              什么是靜態(tài)內(nèi)部類:  靜態(tài)內(nèi)部類定義在類中,任何方法外,用static定義。  
              靜態(tài)內(nèi)部類的用處:   見最后的內(nèi)部類作用。  
              靜態(tài)內(nèi)部類的優(yōu)點(diǎn):  
             靜態(tài)內(nèi)部類注意:靜態(tài)內(nèi)部類中可以定義靜態(tài)或者非靜態(tài)的成員 ,*******生成(new)一個靜態(tài)內(nèi)部類不需要外部類成員:這是靜態(tài)內(nèi)部類和成員內(nèi)部類的區(qū)別。靜態(tài)內(nèi)部類的對象可以直接生成: 
              Outer.Inner in=new Outer.Inner(); 
          而不需要通過生成外部類對象來生成。這樣實際上使靜態(tài)內(nèi)部類成為了一個頂級類。靜態(tài)內(nèi)部類可用private,protected,public,abstract等來修飾*******
            
             
          public class Outer {
              private static int i = 1;
              private int j = 10;

              public static void outer_f1() {

              }

              public void outer_f2() {

              }

              // 靜態(tài)內(nèi)部類可以用public,protected,private修飾
              
          // 靜態(tài)內(nèi)部類中可以定義靜態(tài)或者非靜態(tài)的成員
              static class Inner {
                  static int inner_i = 100;
                  int inner_j = 200;

                  static void inner_f1() {
                      System.out.println("Outer.i " + i);// 靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)成員
                      outer_f1();// 包括靜態(tài)變量和靜態(tài)方法
                  }

                  void inner_f2() {
          //             System.out.println("Outer.i"+j);// error 靜態(tài)內(nèi)部類不能訪問外部類的非靜態(tài)成員
          //             outer_f2();//error 包括非靜態(tài)變量和非靜態(tài)方法
                  }

              }

              public void outer_f3() {
                  // 外部類訪問內(nèi)部類的靜態(tài)成員:內(nèi)部類.靜態(tài)成員
                  System.out.println(Inner.inner_i);   //100
                  Inner.inner_f1();   //Outer.i 1
                  
          // 外部類訪問內(nèi)部類的非靜態(tài)成員:實例化內(nèi)部類即可
                  Inner inner = new Inner();
                  inner.inner_f2();

              }

              public static void main(String[] args) {
                  new Outer().outer_f3();
              }
          }

          4)匿名內(nèi)部類:
              什么是匿名內(nèi)部類:   匿名內(nèi)部類是一種特殊的局部內(nèi)部類,它是通過匿名類實現(xiàn)接口。 
                                              IA被定義為接口。 
                                              IA I=new IA(){};    
              匿名內(nèi)部類的用處:   見最后的內(nèi)部類作用。  
              匿名內(nèi)部類的優(yōu)點(diǎn):  1,一個類用于繼承其他類或是實現(xiàn)接口,并不需要增加額外的方法,只是對繼承方法的實現(xiàn)或是覆蓋。 
                                          2,只是為了獲得一個對象實例,不需要知道其實際類型。 
                                          3,類名沒有意義,也就是不需要使用到。 
             匿名內(nèi)部類注意: 一個匿名內(nèi)部類一定是在new的后面,用其隱含實現(xiàn)一個接口或?qū)崿F(xiàn)一個類,沒有類名,根據(jù)多態(tài),我們使用其父類名。因他是局部內(nèi)部類,那么局部內(nèi)部類的所有限制都對其生效。匿名內(nèi)部類是唯一一種無構(gòu)造                          法類。大部分匿名內(nèi)部類是用于接口回調(diào)用的。匿名內(nèi)部類在編譯的時候由系統(tǒng)自動起名Out$1.class。如果一個對象編譯時的類型是接口,那么其運(yùn)行的類型為實現(xiàn)這個接口的類。因匿名內(nèi)部類無構(gòu)造方法,所以其                          使用范圍非常的有限。當(dāng)需要多個對象時使用局部內(nèi)部類,因此局部內(nèi)部類的應(yīng)用相對比較多。匿名內(nèi)部類中不能定義構(gòu)造方法。如果一個對象編譯時的類型是接口,那么其運(yùn)行的類型為實現(xiàn)這個接口的類。 
          在java的事件處理的匿名適配器中,匿名內(nèi)部類被大量的使用。例如在想關(guān)閉窗口時加上這樣一句代碼: 
          frame.addWindowListener(new WindowAdapter(){
              public void windowClosing(WindowEvent e){
                 System.exit(0);
              }
          }); 

          轉(zhuǎn)載自:http://hnzhoujunmei.iteye.com/blog/1067335



          posted on 2012-08-09 10:12 leoChiang 閱讀(203) 評論(0)  編輯  收藏 所屬分類: 技術(shù)文檔
          主站蜘蛛池模板: 哈密市| 平罗县| 阜宁县| 贡嘎县| 邯郸县| 庆安县| 龙陵县| 敦化市| 新竹县| 通海县| 垦利县| 宜阳县| 三原县| 农安县| 漠河县| 宿州市| 胶南市| 仁布县| 门头沟区| 池州市| 尉犁县| 高碑店市| 突泉县| 高平市| 嵩明县| 静宁县| 新田县| 旌德县| 六盘水市| 会同县| 卢龙县| 南靖县| 廊坊市| 贡嘎县| 东海县| 沅江市| 定结县| 多伦县| 翁牛特旗| 嘉祥县| 泸溪县|