<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 8,  comments - 6,  trackbacks - 0

    1.9  創(chuàng)建一個(gè)匿名的類

    Java1.1+

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

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

    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";
    }
    }

    這是一個(gè)在Java中實(shí)現(xiàn)的簡(jiǎn)單鏈表。LinkedNode類是Linker類的內(nèi)部類。盡管此類包含在Linker類中,仍可以從其他類訪問它,因?yàn)閷⑺x為公有的(public)。通過使用new Linker.LinkedNode(),可以從其他類創(chuàng)建它的一個(gè)實(shí)例。源自核心API的Map.Entry類就是這樣一個(gè)類,當(dāng)在一個(gè)映射表中檢索“鍵/值”表項(xiàng)的集合時(shí),java.util.Map類會(huì)用到此類。

    此外,還可以定義一個(gè)局限于一個(gè)方法的內(nèi)部類。這種類型的類只在定義它的方法內(nèi)是可見的。如果要實(shí)現(xiàn)一個(gè)接口并且希望在方法內(nèi)不止一次地使用局部類,那么很可能這樣做,如下面這個(gè)實(shí)例所示:
    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();
    }
    }


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

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

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

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


    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    留言簿(1)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    主站蜘蛛池模板: 亚洲一卡二卡三卡| 成人毛片18女人毛片免费96| 亚洲高清一区二区三区电影 | 亚洲中文字幕AV在天堂| 国产亚洲精品无码成人| 国产精品免费视频网站| 6080午夜一级毛片免费看| 91视频免费网站| 男女啪啪免费体验区| 亚洲精品国产摄像头| 亚洲黄色三级视频| 亚洲精品乱码久久久久久久久久久久| 国产一级高清免费观看| 成人免费看片又大又黄| 波多野结衣在线免费观看| 精品无码人妻一区二区免费蜜桃 | 成人黄软件网18免费下载成人黄18免费视频 | 免费人成大片在线观看播放| 亚洲免费综合色在线视频| 亚洲国产成人精品无码一区二区| 亚洲色图在线播放| 亚洲av午夜成人片精品网站| 亚洲自偷自偷在线制服| 亚洲人成无码久久电影网站| 亚洲欧洲日产国码一级毛片| 又大又粗又爽a级毛片免费看| 国产91久久久久久久免费| 狠狠久久永久免费观看| 啦啦啦手机完整免费高清观看| 好先生在线观看免费播放| 最近中文字幕免费mv视频8| 中文字幕人成无码免费视频| 18禁止观看免费私人影院| 日韩欧美一区二区三区免费观看| 午夜性色一区二区三区免费不卡视频 | 久久免费国产精品一区二区| 久久国产一片免费观看| 中文字幕免费在线播放| 国产啪精品视频网站免费尤物| 免费国产在线视频| 久久精品国产免费观看三人同眠|