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

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

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

    Dict.CN 在線詞典, 英語學習, 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統計

    留言簿(23)

    積分與排名

    優秀學習網站

    友情連接

    閱讀排行榜

    評論排行榜

    關于JAVA匿名內部類的一點討論.

    source:http://www.cnblogs.com/sgsoft/archive/2004/09/11/42148.html

    關于JAVA匿名內部類的一點討論.
    基本理論:
    -----------------------------------------------------
    關于JAVA內部類:一個內部類的定義是定義在另一個類內部的類。

      存在它的原因是:

      1.一個內部類的對象能夠訪問創建它的對象的實現,包括私有數據。即內部類實例對包含它的哪個類的實例來說,是特權的。

      2.對于同一個包中的其他類來說,內部類能夠隱藏起來,換句話說,內部類不管方法的可見性如何,那怕是public,除了包容類,其他類都無法使用它。

      3.匿名內部類可以很方便的定義回調。

      4.使用內部類可以非常方便的編寫事件驅動程序。


    其實它真正的目的僅僅為了定義回調--進一步就是事件驅動。

    接口和回調:編程一個常用的模式是回調模式,在這種模式中你可以指定當一個特定時間發生時回調對象上的方法。
    --------------------------------------------------
    ?注意事項:
    ?
    ?匿名類和內部類中的中的this :
    ?有時候,我們會用到一些內部類和匿名類。當在匿名類中用this時,這個this則指的是匿名類或內部類本身。
    ?這時如果我們要使用外部類的方法和變量的話,則應該加上外部類的類名。如下面這個例子:

    ?

    public?class?A?{
    ??
    int ?i? = ? 1 ;

    ??public?A()?{
    ????Thread?thread?
    = ? new ?Thread()?{
    ??????public?
    void ?run()?{
    ????????
    for (;;)?{
    ??????????A.
    this .run();
    ??????????
    try ?{
    ????????????sleep(
    1000 );
    ??????????}?
    catch (InterruptedException?ie)?{
    ??????????}
    ????????}
    ??????}
    ????};
    ????thread.start();
    ??}??

    ??public?
    void ?run()?{
    ????System.out.println(
    " i?=? " ? + ?i);
    ????i
    ++ ;
    ??}

    ??public?static?
    void ?main(String[]?args)?throws?Exception?{
    ????
    new ?A();
    ??}

    }


    ?

    ??? 在上面這個例子中, thread 是一個匿名類對象,在它的定義中,它的 run 函數里用到了外部類的 run 函數。
    ??? 這時由于函數同名,直接調用就不行了。這時有兩種辦法,一種就是把外部的 run 函數換一個名字,但這種辦法對于一個開發到中途的應用來說是不可取的
    ??? 。那么就可以用這個例子中的辦法用外部類的類名加上 this 引用來說明要調用的是外部類的方法 run。
    ??? --------------------------------------------------
    ???
    ???
    ??? 對于這個例子:

    this .test( new ?Inner(){
    ?????????????public?
    void ?method1(){
    ?????????????????System.out.print(
    " 1111 " );
    ???????????}
    ????????????
    ?????????????public?
    void ?method2(){
    ?????????????????System.out.print(
    " 22222 " );
    ???????????}
    });

    這個時候調用test()方法,那Inner類的method1和method2是什么時候被調用的?難道也是this對象向他們發消息(比如傳入一個參數)嗎?還是直接顯式的調用??
    ?
    對于Inner類,除了this這個類,就是this.test(...那句中的this,它能夠調用Inner類的方法,其他地方都不行,然而,這也需要你在類中有個地方保存有對這個內部類實例的引用才可以。再說明一次,內部類是用來在某個時刻調用外面的方法而存在的--這就是回調。

    為了說明內部類實例的方法只能在包容類的實例中調用,其他地方無法調用,給個例子如下:

    JAVA2實用教程源碼:

    ?

    ? /* *?一個應用程序,用來演示內部類的使用? */

    /* *?類Outer? */
    class?Outer{?
    private?static?
    int ?size;

    /* *?內部類Inner的聲明? */
    public?class?Inner{?
    private?
    int ?size;

    /* *?方法doStuff()? */
    public?
    void ?doStuff( int ?size){?
    size
    ++ ;? // 存取局部變量
    this .size ++ ;?? // 存取其內部類的成員變量
    Outer. this .size ++ ;? // 存取其外部類的成員變量
    System.out.println(size + " ? " + this .size + " ? " + Outer. this .size);
    }
    }
    // 內部類Inner結束

    /* *?類Outer中定義的實例方法testInner()方法? */
    public?
    void ?testInner(){
    Inner?i
    = new ?Inner();
    i.doStuff(
    5 );?
    }?

    /* *?main()方法? */
    public?static?
    void ?main(String[]?a){?
    Outer?o
    = new ?Outer();
    o.testInner();
    }
    }
    // 類Outer結束

    ?

    ------------------------------------------------
    那么,如何使用內部類,匿名類實現事件處理呢?

    JAVA---事件適配器


    ?1.事件適配器--EventAdapter

      下例中采用了鼠標適配器:
      

    import?java.awt. * ;
      import?java.awt.event.
    * ;
      public?class?MouseClickHandler?extends?MouseAdaper{
        public?
    void ?mouseClicked(MouseEvent?e)? // 只實現需要的方法
           {?……}
      }?

    ?

      java.awt.event包中定義的事件適配器類包括以下幾個:
      1.ComponentAdapter( 組件適配器)
      2.ContainerAdapter( 容器適配器)
      3.FocusAdapter( 焦點適配器)
      4.KeyAdapter( 鍵盤適配器)
      5.MouseAdapter( 鼠標適配器)
      6.MouseMotionAdapter( 鼠標運動適配器)
      7.WindowAdapter( 窗口適配器)

     2. 用內部類實現事件處理

      內部類(inner class)是被定義于另一個類中的類,使用內部類的主要原因是由于:
      ◇ 一個內部類的對象可訪問外部類的成員方法和變量,包括私有的成員。
      ◇ 實現事件監聽器時,采用內部類、匿名類編程非常容易實現其功能。
      ◇ 編寫事件驅動程序,內部類很方便。  
      因此內部類所能夠應用的地方往往是在AWT的事件處理機制中。

    例5.11
       

    import?java.awt. * ?;
       import?java.awt.event.
    *
         public?class?InnerClass{
           private?Frame?f;
           private?TextField?tf;
           public?InnerClass(){
           f
    = new ?Frame( " Inner?classes?example " );
           tf
    = new ?TextField( 30 );
         }

         public?voidi?launchFrame(){
           Label?label
    = new ?Label( " Click?and?drag?the?mouse " );
           f.add(label,BorderLayout.NORTH);
           f.add(tf,BorderLayout.SOUTH);
           f.addMouseMotionListener(
    new ?MyMouseMotionListener()); /* 參數為內部類對象 */
           f.setSize(
    300 , 200 );
           f.setVisible(
    true );?
         }

         class?MyMouseMotionListener?extends?MouseMotionAdapter{?
    /* 內部類開始 */
           public?
    void ?mouseDragged(MouseEvent?e)?{
             String?s
    = " Mouse?dragging:?x= " + e.getX() + " Y= " + e.getY();
             tf.setText(s);?}
           }?;

           public?static?
    void ?main(String?args[])?{
             InnerClass?obj
    = new ?InnerClass();
             obj.launchFrame();
           }
         }
    // 內部類結束
        }


    ?

     3.匿名類(Anonymous Class)

      當一個內部類的類聲名只是在創建此類對象時用了一次,而且要產生的新類需繼承于一個已有的父類或實現一個接口,才能考慮用匿名類,由于匿名類本身無名,因此它也就不存在構造方法,它需要顯示地調用一個無參的父
    類的構造方法,并且重寫父類的方法。所謂的匿名就是該類連名字都沒有,只是顯示地調用一個無參的父類的構造方法。

    例5.12
       

    import?java.awt. * ?;
       import?java.awt.event.
    * ;
        public?class?AnonymousClass{
         private?Frame?f;
         private?TextField?tf;
         public?AnonymousClass(){
          f
    = new ?Frame( " Inner?classes?example " );
          tf
    = new ?TextField( 30 );
        }
        public?
    void ?launchFrame(){
          Label?label
    = new ?Label( " Click?and?drag?the?mouse " );
          f.add(label,BorderLayout.NORTH);
          f.add(tf,BorderLayout.SOUTH);
          f.addMouseMotionListener(
    new ?MouseMotionAdapter(){? // 匿名類開始
           public? void ?mouseDragged(MouseEvent?e){
            String?s
    = " Mouse?dragging:?x= " + e.getX() + " Y= " + e.getY();
            tf.setText(s);?}
          }?);?
    // 匿名類結束?
          f.setSize( 300 , 200 );
          f.setVisible(
    true );
          }
           public?static?
    void ?main(String?args[])?{
            AnonymousClass?obj
    = new ?AnonymousClass();
            obj.launchFrame();
            }
          }

    ?

      其實仔細分析,例5.11和5.12實現的都是完全一樣的功能,只不過采取的方式不同。5.11中的事件處理類是一個內部類,而5.12的事件處理類是匿名類,可以說從類的關系來說是越來越不清楚,但
    是程序也越來越簡練。熟悉這兩種方式也十分有助于編寫圖形界面的程序。

    親自在IDE中實踐一下,會理解的更深切一點

    posted on 2006-04-26 14:59 都市淘沙者 閱讀(455) 評論(0)  編輯  收藏 所屬分類: Java Basic/Lucene/開源資料

    主站蜘蛛池模板: 国产精品亚洲小说专区| 最好免费观看高清在线| 亚洲精品网站在线观看不卡无广告 | 国产伦精品一区二区免费| 亚洲AV无码成人精品区蜜桃| 黄页网站免费在线观看| 黄床大片30分钟免费看| 91久久亚洲国产成人精品性色| 女人18毛片a级毛片免费| 巨胸喷奶水视频www免费视频| 亚洲国产精品成人综合色在线婷婷| 国产精品久久香蕉免费播放| 精品国产免费一区二区三区香蕉| 亚洲日日做天天做日日谢| 日韩一卡2卡3卡4卡新区亚洲| 在线a免费观看最新网站| 香蕉97碰碰视频免费| 亚洲精品国产成人中文| 亚洲国产综合精品一区在线播放| 亚洲黄色片免费看| 一级一看免费完整版毛片| 亚洲av永久综合在线观看尤物 | 亚洲乱码在线播放| 亚洲色成人中文字幕网站| 女人张开腿给人桶免费视频| 日本黄色动图免费在线观看| 亚洲av成人一区二区三区观看在线 | 亚洲国产综合精品中文字幕 | 久操免费在线观看| 日韩在线视频线视频免费网站| 亚洲毛片无码专区亚洲乱| 亚洲精品高清无码视频| 国产免费直播在线观看视频| a毛片视频免费观看影院| 亚洲国产精品乱码一区二区| 亚洲无线一二三四区| 国产精品免费一区二区三区四区| 免费无码AV片在线观看软件| 久久精品国产免费一区| 亚洲欧洲专线一区| 综合自拍亚洲综合图不卡区|