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

          外部類按常規的類訪問方式使用內部類,唯一的差別是外部類可以訪問內部類的所有方法與屬性,包括私有方法與屬性。如:
                  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方法;

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

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

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

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

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

          如果一個類繼承內部類,則創建該類的對象時需提供一個外部類的對象作為構造方法的參數。如:
          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);
              }
          }

          如果創建命名的內部類沒有多少實際意義時,可以創建匿名的內部類。比如使用內部類實現接口的功能(如事件處理器、適配器等),而功能的差異較大,需要根據實際的情況創建相應的內部類時,可以使用匿名內部類。簡單的示例如下:
          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 內部類還有一個作用,那就是實現JAVA的多繼承。JAVA本身是不允許多繼承的,如果我們想一個類繼承多個基類,就可以使用內部類。通過內部類分別繼承一個基類,外部類創建內部類的對象,并使用內部類的方法,變相地實現了多繼承。
          posted on 2008-02-12 13:12 飛鷹 閱讀(40557) 評論(15)  編輯  收藏

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

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

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

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


          網站導航:
           
          主站蜘蛛池模板: 沅江市| 汉阴县| 永和县| 博罗县| 汕尾市| 宝山区| 始兴县| 凉城县| 夏邑县| 冀州市| 许昌县| 澄迈县| 建水县| 平安县| 平凉市| SHOW| 喀喇| 丰台区| 布拖县| 涪陵区| 桃源县| 鄂尔多斯市| 瑞金市| 新兴县| 临朐县| 鄂托克前旗| 肃南| 合作市| 邹城市| 巴彦县| 璧山县| 和林格尔县| 肃南| 庄河市| 仁怀市| 正镶白旗| 靖安县| 富民县| 琼中| 三江| 邮箱|