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

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

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

    隨筆-72  評(píng)論-20  文章-0  trackbacks-1
    1.接口回調(diào)是什么[2]
    接口回調(diào)是指:可以把使用某一接口的類創(chuàng)建的對(duì)象的引用賦給該接口聲明的接口變量,那么該接口變量就可以調(diào)用被類實(shí)現(xiàn)的接口的方法。實(shí)際上,當(dāng)接口變量調(diào)用被類實(shí)現(xiàn)的接口中的方法時(shí),就是通知相應(yīng)的對(duì)象調(diào)用接口的方法,這一過(guò)程稱為對(duì)象功能的接口回調(diào)。看下面示例。
    interface People{
       void peopleList();
    }
    class Student implements People{
       public void peopleList(){
        System.out.println("I’m a student.");
    }
    }
    class Teacher implements People{
      public void peopleList(){
        System.out.println("I’m a teacher.");
    }
    }
    public class Example{
      public static void main(String args[]){
        People a;             //聲明接口變量
    a=new Student();      //實(shí)例化,接口變量中存放對(duì)象的引用
    a.peopleList();        //接口回調(diào)
    a=new Teacher();     //實(shí)例化,接口變量中存放對(duì)象的引用
    a.peopleList();       //接口回調(diào)
    }
    }
    結(jié)果:
    I’m a student.
    I’m a teacher.
    再來(lái)看看向上轉(zhuǎn)型(upcasting)的概念。
     
    2.什么是向上轉(zhuǎn)型[1]
    Shape s=new Circle();
    這里,創(chuàng)建了一個(gè)Circle對(duì)象,并把得到的引用立即賦值給Shape。通過(guò)繼承,Circle就是一種Shape。
    假設(shè)你調(diào)用基類方法(它已在導(dǎo)出類中被覆蓋):
    s.draw();
    由于后期綁定(多態(tài)),將會(huì)正確調(diào)用Circle.draw()方法。
     
    3.向上轉(zhuǎn)型與接口回調(diào)的區(qū)別
    看似向上轉(zhuǎn)型和接口回調(diào)是一回事。看下面兩句話,均出自Thinking in Java
    使用接口的核心原因:為了能夠向上轉(zhuǎn)型為多個(gè)基類型[1]。即利用接口的多實(shí)現(xiàn),可向上轉(zhuǎn)型為多個(gè)接口基類型(具體見(jiàn)《抽象與接口》章節(jié)6)。
    從實(shí)現(xiàn)了某接口的對(duì)象,得到對(duì)此接口的引用,與向上轉(zhuǎn)型為這個(gè)對(duì)象的基類,實(shí)質(zhì)上效果是一樣的。(此句摘自Thinking in Java 3rd 接口與內(nèi)部類一章)
    所以,我認(rèn)為,這兩個(gè)概念是從兩個(gè)方面來(lái)解釋一個(gè)行為。接口回調(diào)的概念,強(qiáng)調(diào)使用接口來(lái)實(shí)現(xiàn)回調(diào)對(duì)象方法使用權(quán)的功能(下一章節(jié)詳細(xì)分析)。而向上轉(zhuǎn)型則牽涉到多態(tài)和運(yùn)行期綁定的范疇。
     
    4.用 Java 接口實(shí)現(xiàn)回調(diào)函數(shù)的等價(jià)功能
    熟悉 MS-Windows X Window System 事件驅(qū)動(dòng)編程模型的開(kāi)發(fā)人員,習(xí)慣于傳遞在某種事件發(fā)生時(shí)調(diào)用(即回調(diào))的函數(shù)指針。Java 的面向?qū)ο竽P湍壳安⒉恢С址椒ㄖ羔槪?font face="Times New Roman">Java 的接口支持提供了一種獲得回調(diào)的等價(jià)功能的機(jī)制。其技巧就是:定義一個(gè)簡(jiǎn)單接口,并在該接口中聲明我們要調(diào)用的方法。
    假定我們希望在某個(gè)事件發(fā)生時(shí)得到通知。我們可以定義一個(gè)接口:
    InterestingEvent.java
    package org.zj.sample;
    public interface InterestingEvent {
        public void interestingEvent ();
    }
    這使得我們可以控制實(shí)現(xiàn)該接口的類的任何對(duì)象。因此,我們不必關(guān)心任何外部類型信息。
    發(fā)出事件信號(hào)的類必須等待實(shí)現(xiàn)了 InterestingEvent 接口的對(duì)象,并在適當(dāng)時(shí)候調(diào)用 interestingEvent() 方法。
    EventNotifier.java
    package org.zj.sample;
    public class EventNotifier {
        private InterestingEvent ie;
        private boolean somethingHappened;
     
        public EventNotifier(InterestingEvent event) {
             ie = event; // 保存事件對(duì)象以備后用。
             somethingHappened = false; // 還沒(méi)有要報(bào)告的事件。
        }
     
        public void doWork() {
             if (somethingHappened) { // 檢查設(shè)置的謂詞。
               ie.interestingEvent();// 通過(guò)調(diào)用接口的這個(gè)方法發(fā)出事件信號(hào)。
             }
        }
       
        public void setHappened(){//設(shè)置謂詞。
             somethingHappened=true;
        }
    }
    在上例中,使用 somethingHappened 謂詞來(lái)跟蹤是否應(yīng)觸發(fā)事件。希望接收事件通知的代碼必須實(shí)現(xiàn) InterestingEvent 接口,并將自身引用傳遞給事件通知程序。
    CallMe.java
    package org.zj.sample;
    public class CallMe implements InterestingEvent {
        @SuppressWarnings("unused")
        private EventNotifier en;
     
        public CallMe() {
             // 注意 EventNotifier (InterestingEvent event),應(yīng)該傳遞一個(gè)接口類型。
             // 而下面將this,即實(shí)現(xiàn)了InterestingEvent接口的CallMe實(shí)例傳遞給
    //EventNotifier。也就是所謂的接口回調(diào)了。
             en = new EventNotifier(this); // 創(chuàng)建事件通知程序,并將自身引用傳遞給它。
        }
     
        // 為事件定義實(shí)際的處理程序。
        public void interestingEvent() {
                  System.out.println("Call me Hello.");
        }
    }
    下面寫個(gè)測(cè)試類。
    Test.java
    package org.zj.sample;
    public class Test {
        public static void main(String[] args) {
             EventNotifier en=new EventNotifier(new CallMe());
             en.setHappened();
             en.doWork();
        }
    }
     
    結(jié)果:
    Call me Hello.
     
    5.參考資料
    [1]Thinking in Java 3rd
    [2]耿祥義,Java實(shí)用教程,清華大學(xué)出版社
    [3] John D. MitchellJava 接口實(shí)現(xiàn)回調(diào)函數(shù)的等價(jià)功能,IBMDeveloper網(wǎng)站

    posted on 2007-08-19 14:05 前方的路 閱讀(10300) 評(píng)論(4)  編輯  收藏 所屬分類: Java技術(shù)

    評(píng)論:
    # re: 什么是接口回調(diào)? 2008-08-07 01:41 | freedoom
    寫得真的很好,吸收了,多謝LZ。  回復(fù)  更多評(píng)論
      
    # re: 什么是接口回調(diào)? 2011-03-12 16:37 | zhanliqing
    例子有點(diǎn)像觀察者模式  回復(fù)  更多評(píng)論
      
    # re: 什么是接口回調(diào)?[未登錄](méi) 2011-05-05 08:49 |
    怎么感覺(jué)類CallMe中的構(gòu)造方法沒(méi)有任何意義 因?yàn)楦緹o(wú)法向外部傳遞信息任何人消息  回復(fù)  更多評(píng)論
      
    # re: 什么是接口回調(diào)? 2011-05-06 01:19 | kenma143
    這個(gè)問(wèn)題我也想了好久 想不明白這個(gè)構(gòu)造函數(shù)的意思和運(yùn)行方式
    最后身體力行 編譯運(yùn)行了一遍 然后把CallMe的構(gòu)造函數(shù)內(nèi)容刪了 然后再編譯運(yùn)行了一遍 發(fā)現(xiàn)沒(méi)有問(wèn)題
    所以我覺(jué)得 這里作者錯(cuò)了 這里的確運(yùn)用了 接口調(diào)用 但不是這一句
    en = new EventNotifier(this);
    而是這一句
    EventNotifier en=new EventNotifier(new CallMe());
    如果有錯(cuò),請(qǐng)指出。  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 国产无遮挡裸体免费视频| 亚洲熟妇丰满多毛XXXX| 日韩毛片免费一二三| 亚洲成av人片天堂网| 成年在线网站免费观看无广告| 最新亚洲人成无码网www电影| 欧洲亚洲国产清在高| 成年女人毛片免费视频| 巨胸喷奶水视频www免费视频| 亚洲性69影院在线观看| 亚洲精品国产日韩无码AV永久免费网| 一级毛片免费观看不卡视频| 看Aⅴ免费毛片手机播放| 精品亚洲aⅴ在线观看| 免费a级毛片网站| 成人福利免费视频| 一边摸一边爽一边叫床免费视频 | 国产亚洲一区二区精品| 国产精品成人免费一区二区| a视频在线免费观看| 亚洲人成网站在线播放2019| 久久精品国产亚洲AV网站| 国产精品国产自线拍免费软件| 一区二区三区四区免费视频 | 久久精品国产亚洲AV香蕉| 亚洲?V无码成人精品区日韩| 97性无码区免费| 久久美女网站免费| 特a级免费高清黄色片| 亚洲男人天堂2022| 久久亚洲精精品中文字幕| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 亚洲一区二区三区免费在线观看| 西西人体大胆免费视频| 亚洲一区二区三区免费观看| 亚洲精品无码永久在线观看你懂的 | 日韩一区二区在线免费观看| 91精品国产免费| 中文字幕不卡免费高清视频| 久久精品国产亚洲av天美18| 亚洲日本视频在线观看|