亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java 回調函數詳解及使用

2020-01-31 16:50:22
字體:
來源:轉載
供稿:網友

Java 回調函數詳解

前言:

C語言中回調函數解釋:

回調函數(Callback Function)是怎樣一種函數呢?
函數是用來被調用的,我們調用函數的方法有兩種:

         直接調用:在函數A的函數體里通過書寫函數B的函數名來調用之,使內存中對應函數B的代碼得以執行。這里,A稱為“主叫函數”(Caller),B稱為“被叫函數”(Callee)。

         間接調用:在函數A的函數體里并不出現函數B的函數名,而是使用指向函數B的函數指針p來使內存中屬于函數B的代碼片斷得以執行――聽起來很酷,是吧。

比起直接調用來,間接調用的確麻煩,那為什么還要使用間接調用呢?原因很簡單――直接調用把函數名都寫進函數體了,經過編譯器那么一編譯,板上釘釘,A注定調用的是B了,這樣的程序只能按照程序員事先設計好的流程執行下去,太呆板了。此時,間接調用的巨大靈活性就顯現出來了。想一想,如果p是函數A的一個參數(參數是變量,是變量就可以變嗎?。?,那么程序的最終用戶完全可以通過操作來改變p的指向――這樣,A在通過p調用函數的時候就有機會調用到不同的函數,這樣程序的實用性和擴展性就強多了。

   在WINDOWS中,程序員想讓系統DLL調用自己編寫的一個方法,于是利用DLL當中回調函數(CALLBACK)的接口來編寫程序,使它調用,這個就稱為回調。在調用接口時,需要嚴格的按照定義的參數和方法調用,并且需要處理函數的異步,否則會導致程序的崩潰。這樣的解釋似乎還是比較難懂,這里舉個簡單的例子,程序員A寫了一段程序(程序a),其中預留有回調函數接口,并封裝好了該程序。程序員B要讓a調用自己的程序b中的一個方法,于是,他通過a中的接口回調自己b中的方法。目的達到。在C/C++中,要用回調函數,被掉函數需要告訴調用者自己的指針地址,但在JAVA中沒有指針,怎么辦?我們可以通過接口(interface)來實現定義回調函數。

  正常情況下開發人員使用已經定義好的API,這個過程叫Call。但是有時這樣不能滿足需求,就需要程序員注冊自己的程序,然后讓事先定義好多API在合適的時候調用注冊的方法,這叫CallBack。

“通常大家說的回調函數一般就是按照別人(李四)的定好的接口規范寫,等待別人(張三)調用的函數,在C語言中,回調函數通常通過函數指針來傳遞;在Java中,通常就是編寫另外一個類或類庫的人(李四)規定一個接口,然后你(張三)來實現這個接口,然后把這個實現類的一個對象作為參數傳給別人的程序,別人的程序必要時就會通過那個接口來調用你編寫的函數?!?/p>

    使用技巧:定一個接口,在接口中聲明我們想調用的方法。

                    在另一個方法中注冊剛定義的回調接口

第一步:定義回調接口

package com.callback; /** * @since 2012-02-02 * @desc 定義回調接口 */public interface CallBackInterface {   public void doSome();      public void exectueMethod();}

第二步:李四編寫的程序

package com.callback; /** * @since 2012-02-02 * @desc 李四 */public class MethodB {   public double getTime(CallBackInterface callBack) {    long start = System.currentTimeMillis();    callBack.exectueMethod();    long end = System.currentTimeMillis();    System.out.println("cost time=" + (end - start));    return end - start;  }}

  第三步:張三實現李四規定的接口

package com.callback; /** * @since 2012-02-02 * @desc 張三 */public class MethodA {   public static void main(String args[]){    MethodB b=new MethodB();    //返回值d只和MethodB有關,和接口中方法的返回值無關    double d=b.getTime(new CallBackInterface() {             //張三實現了李四定義的接口      public void exectueMethod() {        new MethodA().testMethod();      }             @Override      public void doSome() {               }    });    System.out.println("d="+d);  }     public void testMethod(){    for(int i=0;i<10000;i++){      System.out.print("");    }  }}

  輸出結果:

cost time=31d=31.0

理解“回調函數”

所謂回調,就是客戶程序CLIENT調用服務程序SERVER中的某個函數SA,然后SERVER又在某個時候反過來調用CLIENT中的某個函數CB,對于CLIENT來說,這個CB便叫做回調函數。例如Win32下的窗口過程函數就是一個典型的回調函數。

一般說來,CLIENT不會自己調用CB,CLIENT提供CB的目的就是讓SERVER來調用它,而且是CLIENT不得不提供。由于SERVER并不知道CLIENT提供的CB叫甚名誰,所以SERVER會約定CB的接口規范(函數原型),然后由CLIENT提前通過SERVER的一個函數R告訴SERVER自己將要使用CB函數,這個過程稱為回調函數的注冊,R稱為注冊函數。Web SERVERerviCliente以及Java的RMI都用到回調機制,可以訪問遠程服務器程序。

下面舉個通俗的例子:

某天,我打電話向你請教問題,當然是個難題,:),你一時想不出解決方法,我又不能拿著電話在那里傻等,于是我們約定:等你想出辦法后打手機通知我,這樣,我就掛掉電話辦其它事情去了。過了XX分鐘,我的手機響了,你興高采烈的說問題已經搞定,應該如此這般處理。故事到此結束。這個例子說明了“異步+回調”的編程模式。其中,你后來打手機告訴我結果便是一個“回調”過程;我的手機號碼必須在以前告訴你,這便是注冊回調函數;我的手機號碼應該有效并且手機能夠接收到你的呼叫,這是回調函數必須符合接口規范。
通過上面個人感覺到回調函數更多的應用就是結合異步。比如:ajax中jServer通過組件和服務器的異步通信。

什么是回調函數

精妙比喻:回調函數還真有點像您隨身帶的BP機:告訴別人號碼,在它有事情時Call您

回調用于層間協作,上層將本層函數安裝在下層,這個函數就是回調,而下層在一定條件下觸發回調,例如作為一個驅動,是一個底層,他在收到一個數據時,除了完成本層的處理工作外,還將進行回調,將這個數據交給上層應用層來做進一步處理,這在分層的數據通信中很普遍。

其實回調和API非常接近,他們的共性都是跨層調用的函數。但區別是API是低層提供給高層的調用,一般這個函數對高層都是已知的;而回調正好相反,他是高層提供給底層的調用,對于低層他是未知的,必須由高層進行安裝,這個安裝函數其實就是一個低層提供的API,安裝后低層不知道這個回調的名字,但它通過一個函數指針來保存這個回調,在需要調用時,只需引用這個函數指針和相關的參數指針。

其實:回調就是該函數寫在高層,低層通過一個函數指針保存這個函數,在某個事件的觸發下,低層通過該函數指針調用高層那個函數。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品亚洲美女av网站| 日韩小视频在线观看| 欧美日韩亚洲成人| 深夜精品寂寞黄网站在线观看| 综合136福利视频在线| 亚洲aa中文字幕| 福利视频一区二区| 超碰日本道色综合久久综合| 欧美中文字幕视频| 国产香蕉精品视频一区二区三区| 欧美主播福利视频| www欧美日韩| 久久久久久久久久亚洲| 国产不卡精品视男人的天堂| 91精品国产99久久久久久| 国产美女精彩久久| 亚洲成人av片| 日韩精品有码在线观看| 精品国产乱码久久久久久天美| 色妞色视频一区二区三区四区| 91精品国产高清自在线| 中文字幕久久久| 国语自产在线不卡| 国内精品小视频| 国产欧美日韩精品丝袜高跟鞋| 国产欧洲精品视频| 欧洲精品久久久| www国产亚洲精品久久网站| 欧美国产日韩二区| 欧美裸体视频网站| 911国产网站尤物在线观看| 日本欧美爱爱爱| 日韩天堂在线视频| 久久精品成人一区二区三区| 亚洲а∨天堂久久精品9966| 456国产精品| 国产专区精品视频| 国产亚洲精品91在线| 亚洲欧美日韩视频一区| 一区二区三区动漫| 国产精品女主播视频| 国产精品91在线| 欧美日韩国产一区中文午夜| 亚洲视频在线观看网站| 欧美老妇交乱视频| 日韩在线观看免费全集电视剧网站| 国产女精品视频网站免费| 日韩免费视频在线观看| 在线观看成人黄色| 欧美性猛交xxxx乱大交极品| 久久手机精品视频| 国产精品大陆在线观看| 日韩资源在线观看| 日韩av免费看网站| 国产一区二区日韩精品欧美精品| 草民午夜欧美限制a级福利片| 日韩电视剧在线观看免费网站| 欧美日韩加勒比精品一区| 欧美激情一区二区三级高清视频| 亚洲新中文字幕| 欧美寡妇偷汉性猛交| 日韩视频免费中文字幕| 国产精品美女在线观看| 欧美午夜精品久久久久久浪潮| 亚洲精选一区二区| 欧美激情三级免费| 久久精品福利视频| 久久久久久久网站| 久久精品亚洲热| 欧美日韩xxx| 国产精品久久久久久搜索| 欧美在线观看网址综合| 亚洲激情中文字幕| 欧美成人精品一区二区| 欧美一区视频在线| 中文字幕精品—区二区| 日韩av男人的天堂| 国产91色在线|| 国产精品美女www爽爽爽视频| 91视频国产精品| 亚洲精品大尺度| 久久久久久久久91| 国产免费成人av| 亚洲精品电影在线观看| 色噜噜狠狠狠综合曰曰曰88av| 91日韩在线播放| 亚洲精品国产免费| 欧美日韩成人黄色| 成人网欧美在线视频| 亚洲福利在线看| 亚洲国产精品推荐| 九九热r在线视频精品| 欧美成人免费全部| 在线精品高清中文字幕| 日韩亚洲国产中文字幕| 国产精品免费久久久| 91网在线免费观看| 高清在线视频日韩欧美| 日韩中文在线中文网在线观看| 这里精品视频免费| 国产精品免费网站| 久久久视频在线| 97不卡在线视频| 亚洲第五色综合网| 91精品国产综合久久男男| 精品人伦一区二区三区蜜桃网站| 欧美成人手机在线| 久久韩国免费视频| 91午夜在线播放| 亚洲国产精品va在线看黑人动漫| 一本色道久久88亚洲综合88| 久久成人一区二区| 国产一区二区动漫| 成人网页在线免费观看| 国产精品www网站| 欧美激情中文字幕在线| 国产精品网站入口| 亚洲码在线观看| 欧美精品福利在线| 国产一区二区精品丝袜| 欧美日韩性视频在线| 这里只有精品视频| 色偷偷9999www| 91精品久久久久久久久久久| 中文字幕精品av| 黄色成人在线播放| 狠狠久久五月精品中文字幕| 亚洲精品在线观看www| 中文国产成人精品久久一| 日韩美女视频在线观看| 亚洲性线免费观看视频成熟| 亚洲欧美日韩在线高清直播| 欧美福利视频在线观看| 久久久久久亚洲精品| 萌白酱国产一区二区| 久久久久久久久久国产| 欧美激情亚洲一区| 亚洲人成伊人成综合网久久久| 欧美日韩国产一中文字不卡| 欧美极品少妇与黑人| 久久久久久免费精品| 欧美激情欧美狂野欧美精品| 社区色欧美激情 | 亚洲嫩模很污视频| 久久国产精品亚洲| 国产精品久久久999| 国产在线播放不卡| 98精品国产自产在线观看| 亚洲精品www久久久| 欧美激情a∨在线视频播放| 久久这里只有精品视频首页| 在线亚洲男人天堂| 久久精品一本久久99精品| 国产精品亚洲激情| 久久国产精品免费视频| 国产精品美女久久久免费| 欧美午夜电影在线| 亚洲国产精品系列| 在线看国产精品| 久久激情视频免费观看| 欧美三级免费观看| 国产精品专区h在线观看| 中文在线资源观看视频网站免费不卡| 欧美午夜无遮挡|