熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

對Java嵌套類的討論(下)

2013-11-23 19:28:40  來源: Java核心技術 

  Java支持哪些嵌套類?
  Java將嵌套類分成兩個主要的分類嵌套頂級類(nested toplevel classes)和內部類(inner classes)Java還進一步將內部類分為實例內部類(instance inner class) 本地內部類(local inner class)和匿名內部類(and anonymous inner class)要掌握嵌套類你需要懂得每個分類以下我們就來討論以下這些分類首先我們來看一下嵌套頂級類
  嵌套頂級類
  當你在其它類的外面聲明一個類時Java就認為該類是一個頂級類如果你在一個頂級類中聲明一個類並且在該嵌套類的聲明前加上static的修飾符你就得到了一個嵌套頂級類以下的代碼段聲明了一個頂級類和一個嵌套頂級類
  class TopLevelClass
  {
  static class NestedTopLevelClass
  {
  }
  }
  就象靜態的字段和靜態的方法一樣(也可稱為類字段和類方法)一個嵌套的頂級類也是與對象無關的考慮以下的代碼段
  class TopLevelClass
  {
  static int staticField;
  int instanceField;
  
  static class NestedTopLevelClass
  {
  static
  {
  Systemoutprintln (Can access staticField + staticField);
  // Systemoutprintln (Cannot access instanceField + instanceField);
  }
  
  {
  Systemoutprintln (Can access staticField + staticField);
  // Systemoutprintln (Cannot access instanceField + instanceField);
  }
  }
  }
  在上面NestedTopLevelClass類的類初始化和對象初始化代碼塊中你可以訪問TopLevelClass的staticField變量不過你在這兩個代碼塊中都不能訪問instanceField變量因為NestedTopLevelClass和任何的TopLevelClass對象都是無關的所以NestedTopLevelClass 不能訪問TopLevelClass的instanceField變量
  警告一個嵌套頂級類不能訪問任何外部類的實例成員(包括字段和方法)
  雖然NestedTopLevelClass不能訪問TopLevelClass的實例字段但是static的修飾符並不會妨礙NestedTopLevelClass聲明自己的實例字段以及創建NestedTopLevelClass對象列表的代碼就是一個很好的例子
  Listing NestedTopLevelClassDemojava
  // NestedTopLevelClassDemojava
  class TopLevelClass
  {
  static class NestedTopLevelClass
  {
  int myInstanceField;
  NestedTopLevelClass (int i)
  {
  myInstanceField = i;
  }
  }
  }
  class NestedTopLevelClassDemo
  {
  public static void main (String [] args)
  {
  TopLevelClassNestedTopLevelClass ntlc;
  ntlc = new TopLevelClassNestedTopLevelClass ();
  Systemoutprintln (ntlcmyInstanceField);
  }
  }
  在運行後NestedTopLevelClassDemo產生以下的輸出
    
  NestedTopLevelClassDemo的main()方法創建了一個NestedTopLevelClass變量ntlc聲明該變量的語法和列表的一樣(EmployeeJobIterator eji = egetJobIterator ()) 通常當你需要一個嵌套類的變量時要在該嵌套類名的前面加入所有外部類的名字並且用將它們分開用new關鍵字聲明該嵌套類的時候也要這樣做
  這時你可能想知道你是否可以在一個嵌套頂級類中聲明一個頂級嵌套類還有如果兩個不同的外部類聲明了同樣的字段變量名但該變量的類型或者初始化值是不同的?要解答這些問題可看列表
  Listing NestingAndShadowingDemojava
  // NestingAndShadowingDemojava
  class TopLevelClass
  {
  private static int a = ;
  private static int b = ;
  static class NestedTopLevelClass
  {
  private static int a = ;
  static class NestedNestedTopLevelClass
  {
  void printFields ()
  {
  Systemoutprintln (a = + a);
  Systemoutprintln (b = + b);
  }
  }
  }
  }
  class NestingAndShadowingDemo
  {
  public static void main (String [] args)
  {
  TopLevelClassNestedTopLevelClassNestedNestedTopLevelClass nntlc;
  nntlc = new TopLevelClassNestedTopLevelClass
  NestedNestedTopLevelClass ();
  nntlcprintFields ();
  }
  }
  在運行時NestingAndShadowingDemo產生以下的輸出
     a =
     b =
  NestingAndShadowingDemo可以編譯運行證明你可以在頂級嵌套類中嵌套頂級嵌套類結果也顯示了NestedTopLevelClass的一個字段屏蔽了TopLevelClass的字段結果是打印出NestedTopLevelClass的字段內容
  使用嵌套頂級類你不可以訪問外部類的實例字段或者調用該類的實例方法要訪問實例成員Java支持內部類內部類和嵌套頂級類相似不同的地方是你不會在內部內的聲明前加上static關鍵字我們以下就討論一下內部類先從實例內部類開始
  提示你可以在頂級嵌套類前加上privateprotected或者public關鍵字以指示該類在外部類以外的訪問級別
  實例內部類(Instance inner classes)
  假設你在聲明嵌套類時沒有在前面加上static關鍵字這樣你得到的不是一個嵌套頂級類你得到的是一個實例內部類嵌套頂級類只可以訪問外部內的static成員而實例內部類可以同時訪問static和實例成員列表的代碼中有實例內部內的例子在Employee類中你可以看到實例內部類JobIterator仔細觀察這兩個類你可以看到JobIterator可以訪問Employee的private jobs實例字段
  提示你可以在實例內部類前加上privateprotected或者public關鍵字以指示該類在外部類以外的訪問級別
  本地內部類(Local inner classes)
  除了以上的類嵌套外Java還允許你在任意的代碼段中放入一個類該類的代碼放在一對大括號中({ })這意味著類可以出現在一個方法中甚至是在if語句的一對括號中這樣的類就稱為本地內部類
  相對於實例內部類來說本地內部類與有一個好處它除了可以訪問外部類的實例和類字段外(稱為實例和類方法)還可以訪問本地變量和方法的參數列表6就是一個本地內部類
  Listing LocalInnerClassDemojava
  // LocalInnerClassDemojava
  import javautil*;
  class ComputerLanguage
  {
  private String name;
  ComputerLanguage (String name)
  {
  thisname = name;
  }
  public String toString ()
  {
  return name;
  }
  }
  class LocalInnerClassDemo
  {
  public static void main (String [] args)
  {
  ComputerLanguage [] cl =
  {
  new ComputerLanguage (Ada)
  new ComputerLanguage (Algol)
  new ComputerLanguage (APL)
  new ComputerLanguage (Assembly IBM )
  new ComputerLanguage (Assembly Intel)
  new ComputerLanguage (Assembly Mostek)
  new ComputerLanguage (Assembly Motorola)
  new ComputerLanguage (Assembly VAX)
  new ComputerLanguage (Assembly Zilog)
  new ComputerLanguage (BASIC)
  new ComputerLanguage (C)
  new ComputerLanguage (C++)
  new ComputerLanguage (Cobol)
  new ComputerLanguage (Forth)
  new ComputerLanguage (Fortran)
  new ComputerLanguage (Java)
  new ComputerLanguage (LISP)
  new ComputerLanguage (Logo)
  new ComputerLanguage (Modula )
  new ComputerLanguage (Pascal)
  new ComputerLanguage (Perl)
  new ComputerLanguage (Prolog)
  new ComputerLanguage (Snobol)
  };
  Enumeration e = enumerator ((Object []) cl);
  while (ehasMoreElements ())
  Systemoutprintln (enextElement ());
  }
  static Enumeration enumerator (final Object [] array)
  {
  class LocalInnerClass implements Enumeration
  {
  private int index = ;
  public boolean hasMoreElements ()
  {
  return index < array.length;
  }
  public Object nextElement ()
  {
  return array [index++].toString ();
  }
  }
  return new LocalInnerClass ();
  }
  }
  在運行後, LocalInnerClassDemo產生以下的輸出:
     Ada
     Algol
     APL
     Assembly - IBM 360
     Assembly - Intel
     Assembly - Mostek
     Assembly - Motorola
     Assembly - VAX
     Assembly - Zilog
     BASIC
     C
     C++
     Cobol
     Forth
     Fortran
     Java
     LISP
     Logo
     Modula 2
     Pascal
     Perl
     Prolog
     Snobol
  LocalInnerClassDemo展示了在LocalInnerClassDemo的enumerator()類方法中聲
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26930.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.