java的回調(diào)機制(從c語言的函數(shù)指針說起)

1.回調(diào)的前世今生

回調(diào)這個詞最早出現(xiàn)在c語言中跌榔,c語言使用函數(shù)指針來實現(xiàn)回調(diào)函數(shù)這一功能地熄。大致思路如下,使用一個指針窘行,類型是函數(shù)指針饥追,指向參數(shù)一定返回值類型一定的函數(shù),用這個指針當(dāng)做想實現(xiàn)回調(diào)函數(shù)的參數(shù)罐盔,在回調(diào)函數(shù)參數(shù)內(nèi)部使用這個參數(shù)但绕,不用去管函數(shù)名稱,只需要管傳參惶看,還有返回值的處理捏顺。下面讓我們使用一個簡單的例子:

#include <stdio.h>
typedef void(*p)(int i); //定義一個指針指向 返回值是void,參數(shù)是int的函數(shù)
void lowArm(int i) {
    int base = 10;
    printf("傷害為%d\n", base + i);
}
void highArm(int i) {
    int base = 100;
    printf("傷害為%d\n", base + i);
}
void OutPutArm(p arm, int i) {
    arm(i);
}
int main() {
    OutPutArm(lowArm,10);
    OutPutArm(highArm,10);
    return 0;
}

2.JAVA中的回調(diào)

首先在面向?qū)ο笳Z言中纬黎,想實現(xiàn)回調(diào)最好的方式幅骄,就是使用接口,接口內(nèi)帶有想要實現(xiàn)的方法本今,然后子類中去實現(xiàn)這個接口方法拆座,現(xiàn)在我們已經(jīng)有回調(diào)方法了,下面我們要做的就是在別的類中調(diào)用這個方法冠息,但是別的類怎么知道我調(diào)用什么方法呢挪凑,這個方法屬于誰呢,這就是需要注冊Callback逛艰。下面讓我們來幾個例子:
調(diào)用回調(diào)函數(shù)的人

public class You {
    private String who;
    private ContactInterface callBack;
    public You() {
        // TODO Auto-generated constructor stub
    }
    //調(diào)用此方法就表示有人聯(lián)系你了躏碳,注冊到你這來
    public void setCallBack(String who,String question,ContactInterface callBack) {
        this.who = who;
        System.out.println("你說:當(dāng)前聯(lián)系到我的人是"+who+",問題是"+question);
        this.callBack =callBack;
    }
    public void handleThings(){
        //假如你現(xiàn)在正在想問題的答案散怖,需要一點時間
        for(int i=0;i<100000;i++){
            if(i == 0){
                System.out.println("你正在思考問題.....");
            }
        }
        String answer = "答案是A";
        //想到問題的辦法了
        System.out.println("你說:想到答案了菇绵,準(zhǔn)備打回去給"+who+"告訴他答案");
        callBack.callBackByTel(answer);
    }
}

主動定義you,定義匿名類注冊回調(diào)杭抠。

public class Me {
    public static void main(String[] args){
        Me me = new Me();
        me.hasQuestion();
    }
    private void hasQuestion(){
        //現(xiàn)在有問題想不出來答案脸甘,想去問你
        You you = new You();
        you.setCallBack("蝸牛", "某道題答案是什么?", new ContactInterface() {
                @Override
                public void callBackByTel(String answer) {
                System.out.println("我說:嗯偏灿,好的丹诀,我收到答案了:"+answer+",謝謝");
                }
                });
    }
}

然后我們就可以在hasQuestion中使用you調(diào)用處理函數(shù)了,處理函數(shù)又會反過來調(diào)用铆遭,這就是回調(diào)硝桩。

上面我們實現(xiàn)的是同步回調(diào)
所謂異步回調(diào),就是在線程中而已枚荣,注冊之后碗脊,調(diào)用回調(diào)函數(shù)的步驟在run中執(zhí)行。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末橄妆,一起剝皮案震驚了整個濱河市衙伶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌害碾,老刑警劉巖矢劲,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異慌随,居然都是意外死亡芬沉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門阁猜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丸逸,“玉大人,你說我怎么就攤上這事剃袍』聘眨” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵笛园,是天一觀的道長隘击。 經(jīng)常有香客問我侍芝,道長研铆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任州叠,我火速辦了婚禮棵红,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咧栗。我一直安慰自己逆甜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布致板。 她就那樣靜靜地躺著交煞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斟或。 梳的紋絲不亂的頭發(fā)上素征,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼御毅。 笑死根欧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的端蛆。 我是一名探鬼主播凤粗,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼今豆!你這毒婦竟也來了嫌拣?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤呆躲,失蹤者是張志新(化名)和其女友劉穎亭罪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歼秽,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡应役,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了燥筷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片箩祥。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肆氓,靈堂內(nèi)的尸體忽然破棺而出袍祖,到底是詐尸還是另有隱情,我是刑警寧澤谢揪,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布蕉陋,位于F島的核電站,受9級特大地震影響拨扶,放射性物質(zhì)發(fā)生泄漏凳鬓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一患民、第九天 我趴在偏房一處隱蔽的房頂上張望缩举。 院中可真熱鬧,春花似錦匹颤、人聲如沸仅孩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辽慕。三九已至,卻和暖如春赦肃,著一層夾襖步出監(jiān)牢的瞬間溅蛉,已是汗流浹背绞旅。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留温艇,地道東北人因悲。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像勺爱,于是被迫代替她去往敵國和親晃琳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹 對...
    cosWriter閱讀 11,104評論 1 32
  • 原文地址: 原文來源不詳. 一, 回調(diào)函數(shù)小解 我們經(jīng)常在 C++ 設(shè)計時使用回調(diào)函數(shù)可以使有些應(yīng)用 (如定時器時...
    Caiaolun閱讀 1,652評論 0 3
  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型琐鲁。 運用指針編程是C語言最主要的風(fēng)格之一卫旱。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,446評論 3 44
  • 原文地址:C語言函數(shù)調(diào)用棧(一)C語言函數(shù)調(diào)用棧(二) 0 引言 程序的執(zhí)行過程可看作連續(xù)的函數(shù)調(diào)用围段。當(dāng)一個函數(shù)執(zhí)...
    小豬啊嗚閱讀 4,616評論 1 19
  • 函數(shù)和對象 1顾翼、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句奈泪,而且...
    道無虛閱讀 4,566評論 0 5