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

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

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

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

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

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

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

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

          如果一個(gè)類(lèi)繼承內(nèi)部類(lèi),則創(chuàng)建該類(lèi)的對(duì)象時(shí)需提供一個(gè)外部類(lèi)的對(duì)象作為構(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)部類(lèi)沒(méi)有多少實(shí)際意義時(shí),可以創(chuàng)建匿名的內(nèi)部類(lèi)。比如使用內(nèi)部類(lèi)實(shí)現(xiàn)接口的功能(如事件處理器、適配器等),而功能的差異較大,需要根據(jù)實(shí)際的情況創(chuàng)建相應(yīng)的內(nèi)部類(lèi)時(shí),可以使用匿名內(nèi)部類(lèi)。簡(jiǎn)單的示例如下:
          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)部類(lèi)還有一個(gè)作用,那就是實(shí)現(xiàn)JAVA的多繼承。JAVA本身是不允許多繼承的,如果我們想一個(gè)類(lèi)繼承多個(gè)基類(lèi),就可以使用內(nèi)部類(lèi)。通過(guò)內(nèi)部類(lèi)分別繼承一個(gè)基類(lèi),外部類(lèi)創(chuàng)建內(nèi)部類(lèi)的對(duì)象,并使用內(nèi)部類(lèi)的方法,變相地實(shí)現(xiàn)了多繼承。
          posted on 2008-02-12 13:12 飛鷹 閱讀(40557) 評(píng)論(15)  編輯  收藏

          評(píng)論:
          # re: JAVA 內(nèi)部類(lèi)的簡(jiǎn)單總結(jié) 2008-09-01 13:38 | think
          唯一的差別是外部類(lèi)可以訪問(wèn)內(nèi)部類(lèi)的所有方法與屬性
          是內(nèi)部類(lèi)可以訪問(wèn)外部類(lèi)吧!  回復(fù)  更多評(píng)論
            
          # re: JAVA 內(nèi)部類(lèi)的簡(jiǎn)單總結(jié)[未登錄](méi) 2009-09-16 09:19 | long
          驢頭不對(duì)
          馬嘴未開(kāi)  回復(fù)  更多評(píng)論
            
          # re: JAVA 內(nèi)部類(lèi)的簡(jiǎn)單總結(jié)[未登錄](méi) 2009-09-18 14:07 | 蝸牛
          內(nèi)部類(lèi)可以直接訪問(wèn)外部類(lèi)的成員變量與方法,當(dāng)然包括private修飾的。而樓主說(shuō)的不對(duì)  回復(fù)  更多評(píng)論
            
          # re: JAVA 內(nèi)部類(lèi)的簡(jiǎn)單總結(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)部類(lèi),則 System.out.println(o.code)語(yǔ)句會(huì)編譯失敗,因?yàn)閏ode是私有屬性。

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

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

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 清丰县| 临江市| 深水埗区| 芜湖县| 玛曲县| 施甸县| 临颍县| 崇州市| 岚皋县| 新民市| 应用必备| 象山县| 上栗县| 胶州市| 龙岩市| 南京市| 藁城市| 河北省| 西宁市| 博白县| 遂川县| 汾阳市| 仲巴县| 大悟县| 榆树市| 吐鲁番市| 新蔡县| 罗山县| 阜新市| 砚山县| 江西省| 小金县| 嘉定区| 乐至县| 泾川县| 神池县| 莆田市| 临颍县| 泸溪县| 兴义市| 江北区|