隨筆-10  評論-36  文章-6  trackbacks-0
          定義在一個類內(nèi)部的類叫內(nèi)部類,包含內(nèi)部類的類稱為外部類。內(nèi)部類可以聲明public、protected、private等訪問限制,可以聲明為abstract的供其他內(nèi)部類或外部類繼承與擴(kuò)展,或者聲明為static、final的,也可以實(shí)現(xiàn)特定的接口。static的內(nèi)部類行為上象一個獨(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)部類對象時總是需要一個創(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)部類沒有多少實(shí)際意義時,可以創(chuàng)建匿名的內(nèi)部類。比如使用內(nèi)部類實(shí)現(xiàn)接口的功能(如事件處理器、適配器等),而功能的差異較大,需要根據(jù)實(shí)際的情況創(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)部類還有一個作用,那就是實(shí)現(xiàn)JAVA的多繼承。JAVA本身是不允許多繼承的,如果我們想一個類繼承多個基類,就可以使用內(nèi)部類。通過內(nèi)部類分別繼承一個基類,外部類創(chuàng)建內(nèi)部類的對象,并使用內(nèi)部類的方法,變相地實(shí)現(xiàn)了多繼承。
          posted on 2008-02-12 13:12 飛鷹 閱讀(40565) 評論(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)語句會編譯失敗,因?yàn)閏ode是私有屬性。

          所以,我說:外部類按常規(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 | 歡樂往昔
          還是樓主有理,擺了事實(shí),講了道理  回復(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)部實(shí)現(xiàn)封裝
          2 實(shí)現(xiàn)多繼承  回復(fù)  更多評論
            
          # re: JAVA 內(nèi)部類的簡單總結(jié) 2010-12-05 12:31 | 扯淡樓主
          樓主有點(diǎn)瞎扯  回復(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
          確實(shí)誤導(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)航:
           
          主站蜘蛛池模板: 武汉市| 江北区| 庐江县| 武定县| 夏津县| 苏尼特右旗| 盐城市| 德保县| 高青县| 南漳县| 平潭县| 海丰县| 巨野县| 来凤县| 新昌县| 樟树市| 沽源县| 历史| 锦屏县| 封开县| 临城县| 皮山县| 南溪县| 黑龙江省| 呼玛县| 宝山区| 昭苏县| 南城县| 沙湾县| 临江市| 安塞县| 辉南县| 新干县| 清新县| 灵台县| 松桃| 敖汉旗| 灯塔市| 绵阳市| 东莞市| 云阳县|