官术网_书友最值得收藏!

2.5 內部類

定義在類內部的類被稱為內部類。內部類根據不同的定義方式,可分為靜態內部類、成員內部類、局部內部類和匿名內部類這4種。

2.5.1 靜態內部類

定義在類內部的靜態類被稱為靜態內部類。靜態內部類可以訪問外部類的靜態變量和方法;在靜態內部類中可以定義靜態變量、方法、構造函數等;靜態內部類通過“外部類.靜態內部類”的方式來調用,具體的實現代碼如下:

public  class  OuterClass  {
    private  static  String  className  ="staticInnerClass";
  //定義一個靜態內部類
    public  static  class  StaticInnerClass  {
      public  void  getClassName()  {
          System.out.println("className:"+className  );
      }
  }
  public  static  void  main(String[]  args)  {
      //調用靜態內部類
      OuterClass.StaticInnerClass  staticInnerClass  =
                        new  OuterClass.StaticInnerClass();
      staticInnerClass.getClassName();
  }
}

上面的代碼通過public static class StaticInnerClass{}代碼塊定義了一個靜態內部類StaticInnerClass,然后定義了靜態內部類的getClassName方法,在使用的過程中通過“外部類.靜態內部類”的方式進行調用,具體的實現代碼如下:

OuterClass.StaticInnerClass  staticInnerClass  =  new
OuterClass.StaticInnerClass()

這樣就定義一個靜態內部類并可以像普通類那樣調用靜態內部類的方法。

Java集合類HashMap在內部維護了一個靜態內部類Node數組用于存放元素,但Node數組對使用者是透明的。像這種和外部類關系密切且不依賴外部類實例的類,可以使用靜態內部類實現。

2.5.2 成員內部類

定義在類內部的非靜態類叫作成員內部類,成員內部類不能定義靜態方法和變量(final修飾的除外),因為成員內部類是非靜態的,而在Java的非靜態代碼塊中不能定義靜態方法和變量。成員內部類具體的實現代碼如下:

public  class  OutClass{
  private  static  int  a;
  private  int  b;
 //定義一個成員內部類
  public  class  MemberInnerClass{
      public  void  print()  {
        System.out.println(a);
        System.out.println(b);
      }
  }
}

從上述代碼可以看到,在OutClass中通過public class MemberInnerClass定義了一個成員內部類,其使用方式和靜態內部類相同。

2.5.3 局部內部類

定義在方法中的類叫作局部內部類。當一個類只需要在某個方法中使用某個特定的類時,可以通過局部類來優雅地實現,具體的實現代碼如下:

public  class  OutClass  {
  private  static  int  a;
  private  int  b;
  public  void  partClassTest(final  int  c)  {
      final  int  d  =  1;
      //在partClassTest方法中定義一個局部內部類PastClass
      class  PastClass{
        public  void  print()  {
                  System.out.println(c);
            }
      }
  }
}

以上代碼在partClassTest方法中通過class PastClass{}語句塊定義了一個局部內部類。

2.5.4 匿名內部類

匿名內部類指通過繼承一個父類或者實現一個接口的方式直接定義并使用的類。匿名內部類沒有class關鍵字,這是因為匿名內部類直接使用new生成一個對象的引用。具體的實現代碼如下:

public  abstract  class  Worker{
  private  String  name;
  public  String  getName()  {
      return  name;
  }
  public  void  setName(String  name)  {
      this.name  =  name;
  }
  public  abstract  int  workTime();
}
 public  class  Test  {
    public  void  test(Worker   worker){
      System.out.println(worker.getName() + "工作時間: " +
                    worker.workTime());
    }
    public  static  void  main(String[]  args)  {
      Test  test  =  new  Test();
      //在方法中定義并使用匿名內部類
      test.test(new  Worker()  {
            public  int  workTime()  {
              return  8;
          }
            public  String  getName()  {
              return  "alex";
          }
      });
    }
}

在以上代碼中首先定義了一個抽象類Worker和一個抽象方法workTime,然后定義了一個Test類,在Test類中定義了一個方法,該方法接收一個Worker參數,這時匿名類需要的準備工作都已做好。在需要一個根據不同場景有不同實現的匿名內部類時,直接在test方法中新建匿名內部類并重寫相關方法即可。

主站蜘蛛池模板: 湖口县| 靖宇县| 绥芬河市| 顺昌县| 莱芜市| 县级市| 吉首市| 清水县| 镇远县| 昭平县| 潍坊市| 古田县| 二连浩特市| 睢宁县| 永登县| 台州市| 堆龙德庆县| 江都市| 南陵县| 土默特左旗| 西吉县| 林口县| 信丰县| 竹山县| 泸州市| 江华| 墨玉县| 朝阳县| 阜南县| 遂宁市| 新疆| 屯昌县| 济阳县| 峡江县| 海南省| 阳城县| 曲阳县| 旬邑县| 辽阳县| 增城市| 千阳县|