posts - 8,  comments - 6,  trackbacks - 0

          1.9  創建一個匿名的類

          Java1.1+

          當進行Java開發時,有時需要實現一個僅包含1~2個方法的接口,并且每個方法只有1~2行代碼。在AWT和Swing開發中經常會出現這種情況,例如當一個display組件需要一個事件回調方法(如一個按鈕的ActionListener)時。如果使用普通的類來實現此操作,最終會得到很多僅在單個位置上使用的小型類。其實,Java允許定義內部類,而且可以在GUI架構外使用內部類。

          內部類(inner class)是指在另一個類內部定義的一個類。可以將內部類定義為一個類的成員,如下例所示:

          public class Linker {
          public class LinkedNode {
          LinkedNode prev, next;
          Object contents;
          }

          public Linker() {
          LinkedNode first = new LinkedNode();
          LinkedNode second = new LinkedNode();
          first.next = second;
          first.contents = "This is the first item";
          second.prev = first;
          second.contents = "This is the second item";
          }
          }

          這是一個在Java中實現的簡單鏈表。LinkedNode類是Linker類的內部類。盡管此類包含在Linker類中,仍可以從其他類訪問它,因為將它定義為公有的(public)。通過使用new Linker.LinkedNode(),可以從其他類創建它的一個實例。源自核心API的Map.Entry類就是這樣一個類,當在一個映射表中檢索“鍵/值”表項的集合時,java.util.Map類會用到此類。

          此外,還可以定義一個局限于一個方法的內部類。這種類型的類只在定義它的方法內是可見的。如果要實現一個接口并且希望在方法內不止一次地使用局部類,那么很可能這樣做,如下面這個實例所示:
          public class Happiness {
          interface Smiler { public void smile(); }

          public static void main(String[] args)
          {
          class Happy implements Smiler {
          private String more = "";
          public void smile() {
          System.out.println(":-)" + more);
          }
          public void happier() {
          more += ")";
          }
          }

          Happy h1 = new Happy();
          h1.smile();
          Happy h2 = new Happy();
          h2.happier();
          h2.smile();
          }
          }


          局部內部類的名稱為Happy(我喜歡把它看作內部者的類)。它不能從其他任何類或方法中訪問。使用這個局部類是為了實現Smiler接口(它是在Happiness內部定義的)。對于很多情況而言,甚至不需要為一個局部內部類命名—— 它可以保持為匿名的。對于實現僅有1~2個方法的接口而言匿名類非常有用,尤其是當需要創建一個僅使用一次的實例的時候。通常情況下不能直接實例化一個接口。例如,不能調用Runnable接口的構造函數(這是由Thread使用的接口)。下面的做法是非法的:
          Runnable runner = new Runnable(); // not allowed!  

          但是,Java確實允許創建一個用于實現接口的匿名局部類的實例。可以使用一種特殊的語法來創建一個接口的實例:
          Runnable runner = new Runnable() {
          public void run() {
          for (int i=0; i<10000000; i++) {
          countSheep();
          }
          }
          };

          此代碼創建了一個局部匿名類,實例化該類并為runner變量分配新的實例。需要確保你的類定義(外層花括號之間的代碼)實現了接口的所有方法。此外,還可以按照這種方式創建子類。下面的代碼實例化Object的一個匿名子類并將它分配給一個變量:
          Object timePrinter = new Object() {
          public String toString() {
          return String.valueOf(System.currentTimeMillis());
          }
          };
          System.out.println(timePrinter);

          匿名類是Java開發人員常用的一個有用工具。無論何時需要一次性地實現一個接口(或子類),都可以考慮使用這些類。但最好將它們用于僅有一到兩個方法的小型接口。


          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          主站蜘蛛池模板: 台东县| 汾西县| 台安县| 天台县| 金堂县| 淳化县| 罗山县| 尼勒克县| 开阳县| 宜章县| 昌江| 井陉县| 增城市| 织金县| 安宁市| 宁陕县| 合作市| 北票市| 新疆| 昭苏县| 奈曼旗| 保定市| 长春市| 景泰县| 闽侯县| 吉木萨尔县| 鹿邑县| 沿河| 通海县| 泸定县| 新巴尔虎左旗| 卢氏县| 泊头市| 淮南市| 南澳县| 陇川县| 通州区| 新民市| 昌乐县| 榆中县| 左贡县|