隨筆-10  評論-36  文章-6  trackbacks-0
          定義在一個類內(nèi)部的類叫內(nèi)部類,包含內(nèi)部類的類稱為外部類。內(nèi)部類可以聲明public、protected、private等訪問限制,可以聲明為abstract的供其他內(nèi)部類或外部類繼承與擴展,或者聲明為static、final的,也可以實現(xiàn)特定的接口。static的內(nèi)部類行為上象一個獨立的類,非static在行為上類似類的屬性或方法且禁止聲明static的方法。內(nèi)部類可以訪問外部類的所有方法與屬性,但static的內(nèi)部類只能訪問外部類的靜態(tài)屬性與方法。

          外部類按常規(guī)的類訪問方式使用內(nèi)部類,唯一的差別是外部類可以訪問內(nèi)部類的所有方法與屬性,包括私有方法與屬性。如:
                  pinner p = new pinner();
                  p.index = 20;
                  p.Print();
                  ---- 這種方式適合外部類的非static方法;

                  pouter po = new pouter();
                  pinner pi = po.new pinner();
                  pi.index = 40;
                  pi.Print();
                  ---- 這種方式適合外部類的static方法;

          內(nèi)部類類似外部類的屬性,因此訪問內(nèi)部類對象時總是需要一個創(chuàng)建好的外部類對象。內(nèi)部類對象通過‘外部類名.this.xxx’的形式訪問外部類的屬性與方法。如:
                      System.out.println("Print in inner Outer.index=" + pouter.this.index);
                      System.out.println("Print in inner Inner.index=" + this.index);

          如果需要在其他類中訪問內(nèi)部類,可以使用:
          (1)外部類提供創(chuàng)建內(nèi)部類的方法供其他類使用。如:
                  // 外部類
                  pinner getInner()
                  {
                      return new pinner();
                  }

                  // 其他類
                  pouter.pinner pi = po.getInner();
                  pi.Print();

          (2)直接創(chuàng)建內(nèi)部類的對象。如:
                  pouter po = new pouter();
                  pouter.pinner pi = po.new pinner();
                  pi.Print();

          內(nèi)部類可以聲明在外部類的方法中或語句塊中。如果內(nèi)部類需要訪問包含它的外部類方法或語句塊的局部變量或參數(shù),則該局部變量或參數(shù)必須是final的。外部類的其他方法、其他類無法訪問聲明在方法內(nèi)部或塊內(nèi)部的內(nèi)部類。

          如果一個類繼承內(nèi)部類,則創(chuàng)建該類的對象時需提供一個外部類的對象作為構(gòu)造方法的參數(shù)。如:
          class Car
          {
              class Wheel
              {

              }
          }

          class SuperWheel extends Car.Wheel
          {
              SuperWheel(Car car)
              {
                  car.super();
              }

              public static void main(String [] args)
              {
                  Car car = new Car();
                  SuperWheel wl = new SuperWheel(car);
              }
          }

          如果創(chuàng)建命名的內(nèi)部類沒有多少實際意義時,可以創(chuàng)建匿名的內(nèi)部類。比如使用內(nèi)部類實現(xiàn)接口的功能(如事件處理器、適配器等),而功能的差異較大,需要根據(jù)實際的情況創(chuàng)建相應(yīng)的內(nèi)部類時,可以使用匿名內(nèi)部類。簡單的示例如下:
          interface WebView
          {
              void doGet();
          }

          class A
          {
              WebView ShowName()
              {
                  return new WebView()
                  {
                      void doGet()
                      {
                          System.out.println("Name");
                      }    
                  };
              }

              WebView ShowCode()
              {
                  return new WebView()
                  {
                      void doGet()
                      {
                          System.out.println("Code");
                      }    
                  };
              }
          }

          最后,JAVA 內(nèi)部類還有一個作用,那就是實現(xiàn)JAVA的多繼承。JAVA本身是不允許多繼承的,如果我們想一個類繼承多個基類,就可以使用內(nèi)部類。通過內(nèi)部類分別繼承一個基類,外部類創(chuàng)建內(nèi)部類的對象,并使用內(nèi)部類的方法,變相地實現(xiàn)了多繼承。
          posted on 2008-02-12 13:12 飛鷹 閱讀(40558) 評論(15)  編輯  收藏

          評論:
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2008-09-01 13:38 | think
          唯一的差別是外部類可以訪問內(nèi)部類的所有方法與屬性
          是內(nèi)部類可以訪問外部類吧!  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié)[未登錄] 2009-09-16 09:19 | long
          驢頭不對
          馬嘴未開  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié)[未登錄] 2009-09-18 14:07 | 蝸牛
          內(nèi)部類可以直接訪問外部類的成員變量與方法,當(dāng)然包括private修飾的。而樓主說的不對  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2009-09-18 15:25 | sham2k
          看看下面的例子:

          package testcase;

          public class OuterClass
          {
          class InnerClass
          {
          private int code = 100;
          }

          public static void main(String[] args)
          {
          OuterClass outer = new OuterClass();
          InnerClass o = outer.new InnerClass();

          System.out.println(o.code);
          }

          }

          如果InnerClass不是OuterClass的內(nèi)部類,則 System.out.println(o.code)語句會編譯失敗,因為code是私有屬性。

          所以,我說:外部類按常規(guī)的類訪問方式使用內(nèi)部類,唯一的差別是外部類可以訪問內(nèi)部類的所有方法與屬性,包括私有方法與屬性。

          至于內(nèi)部類對外部類的使用,我在最前面就說了:內(nèi)部類可以訪問外部類的所有方法與屬性,但static的內(nèi)部類只能訪問外部類的靜態(tài)屬性與方法。
            回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2010-02-24 17:07 | 歡樂往昔
          還是樓主有理,擺了事實,講了道理  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2010-08-11 11:55 | 的薩菲
          發(fā)大水  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2010-08-11 11:55 | 的薩菲
          發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2010-08-11 11:55 | 的薩菲
          發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水發(fā)大水  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2010-09-06 13:21 | 趙琳
          內(nèi)部類最有效的使用應(yīng)該是:
          1 可以很好的對類內(nèi)部實現(xiàn)封裝
          2 實現(xiàn)多繼承  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2010-12-05 12:31 | 扯淡樓主
          樓主有點瞎扯  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2010-12-20 18:16 | 你個狗日的
          @扯淡樓主
          樓主不要出人誤導(dǎo)人啊。。有些說法是不正確的,唉,,誤導(dǎo)我?guī)讉€小時啊。  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2010-12-22 16:44 | coody
          確實誤導(dǎo)人,不清楚的概念就不要發(fā)出來啊  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié)[未登錄] 2011-11-30 17:24 |
          你好@long
            回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié)[未登錄] 2012-09-27 13:56 | test
          我試了試,內(nèi)部類可以訪問外部類的所有方法與屬性,反之亦然。  回復(fù)  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 丹凤县| 南安市| 克拉玛依市| 乌鲁木齐县| 贡觉县| 宁国市| 定结县| 嘉善县| 资源县| 玛纳斯县| 平原县| 惠州市| 苍梧县| 天峨县| 安仁县| 浪卡子县| 元谋县| 靖西县| 钟祥市| 阳谷县| 霸州市| 灵寿县| 平利县| 德江县| 颍上县| 沾益县| 高安市| 中卫市| 宝丰县| 塔河县| 丹棱县| 克东县| 玛沁县| 泰兴市| 会理县| 洛川县| 莎车县| 高平市| 海林市| 阳山县| 南郑县|