隨筆-10  評(píng)論-36  文章-6  trackbacks-0
          定義在一個(gè)類內(nèi)部的類叫內(nèi)部類,包含內(nèi)部類的類稱為外部類。內(nèi)部類可以聲明public、protected、private等訪問限制,可以聲明為abstract的供其他內(nèi)部類或外部類繼承與擴(kuò)展,或者聲明為static、final的,也可以實(shí)現(xiàn)特定的接口。static的內(nèi)部類行為上象一個(gè)獨(dú)立的類,非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)部類對(duì)象時(shí)總是需要一個(gè)創(chuàng)建好的外部類對(duì)象。內(nèi)部類對(duì)象通過‘外部類名.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)部類的對(duì)象。如:
                  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)部類。

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

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

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

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

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 台山市| 兰坪| 宁德市| 蓝田县| 旌德县| 噶尔县| 嘉义市| 宜君县| 隆尧县| 交城县| 高阳县| 井陉县| 盐池县| 井研县| 云浮市| 天台县| 开鲁县| 顺义区| 南岸区| 固阳县| 通江县| 连城县| 天柱县| 吉林省| 宁南县| 新巴尔虎左旗| 柳江县| 运城市| 景德镇市| 离岛区| 新巴尔虎右旗| 玉溪市| 宜君县| 汉沽区| 舞阳县| 马山县| 陆丰市| 许昌县| 简阳市| 自治县| 县级市|