java基础-回调函数(callback)

                                            作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

  回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

  在C和C++中有回调函数数一个显而易见的东西,但是在Java中它没有这个机制,只能我们手动实现。本篇博客就用Java实现一个简单的回调函数案例。

一.Java回调机制

  1>.Class A 实现接口 CallBack callback;
  2>.Class A 中包含一个lB的引用b;
  3>.Class B 有一个参数为callback 的方法f(CallBack callback);
  4>.Class A的对象a调用Class B方法f(CallBack callback),换句话说,就是A类调用B类的某个方法c;
  5>.然后b就可以在f(CallBack callback)方法中调用A的方法,换句话说就是B类调用A类的某个方法d;

二.案例展示

1>.场景分析

  马上快到周五了,小明想要跟他的女朋友一起去看电影,以下是他们的通话记录:

    小明说:[亲爱的,周五有部电影要首映,我关注了好久,我们一起去看吧,从19:00~23:30都可以看,你啥时候下班呢?]

    小红说:[啊~啊~好刺激呀,我在吃辣条呢,一会打给你]

    小明说:[那我先忙手上的工作了!]

    小红说:[下班我回家换套衣服,要不晚上10:30不见不散!]

2>.代码实现

  CallBack.java 代码如下:

/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs; public interface CallBack {
/**
* 这是小红知道答案时要调用的函数告诉小明,也就是回调函数,这个接口我是可以自定义哟。
*/
public abstract void resolv(String result);
}

  XiaoMing.java 文件内容如下:

/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs; /**
* 这是小明
* 实现了一个回调接口CallBack。
*/
public class XiaoMing implements CallBack {
/**
* 创建一个对小红对象的引用
*/
private XiaoHong xiaohong;
/**
* 小明的构造方法,持有对Xiaohong的引用
*/
public XiaoMing(XiaoHong xiaohong) {
this.xiaohong = xiaohong;
} public XiaoMing() { } /**
* 小明通过这个方法去问小红问题
*/
public void askQuestion(final String question) throws InterruptedException {
Thread ask = new Thread() {
@Override
public void run() {
try {
xiaohong.execute(XiaoMing.this, question);
} catch (Exception ex) {
ex.printStackTrace();
}
}
};
ask.start();
// ask.join();
//小明问完问题挂掉电话就去忙工作上的事情了
work();
} public void work(){
String work = "小明说:[那我先忙手上的工作了!]";
System.out.println(work);
} /**
* 这是小红确定了看电影的具体时间,调用此方法告诉小明,就是所谓的小明的回调方法。
*/
public void resolv(String result) {
System.out.printf("小红说:[%s]\n",result);
}
}

  XiaoHong.java 文件内容如下:

/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs; /**
* 这个就是小红
*/
public class XiaoHong {
/**
*小明问的问题
*/
public void execute(CallBack callBack ,String question) throws InterruptedException {
System.out.println(question);
//模拟小红办自己的事情需要很长时间
System.out.println("小红说:[啊~啊~好刺激呀,我在吃辣条呢,一会打给你]");
Thread.sleep(10000);
//小红办完自己的事情之后就想到了答案是“晚上加班,去不了啦,下次吧!”
String result = "下班我回家换套衣服,要不晚上10:30不见不散!";
/**
* 于是就打电话告诉小明,调用小明中的方法。
*/
callBack.resolv(result);
}
}

  Demo.java 文件内容如下:

/*
@author :yinzhengjie
Blog:http://www.cnblogs.com/yinzhengjie/tag/Hadoop%E8%BF%9B%E9%98%B6%E4%B9%8B%E8%B7%AF/
EMAIL:y1053419035@qq.com
*/
package cn.org.yinzhengjie.hdfs; public class Demo {
public static void main(String[] args) throws InterruptedException {
XiaoHong xiaoHong = new XiaoHong();
XiaoMing xiaoMing = new XiaoMing(xiaoHong); String question = "小明说:[亲爱的,周五有部电影要首映,我关注了好久,我们一起去看吧,从19:00~23:30都可以看,你啥时候下班呢?]";
xiaoMing.askQuestion(question);
}
}

3>.小结

  xiaoMing调用xiaoHong的execute方法,xiaoHong在execute方法中通过CallBack接口调用xiaoMing的resolve。

java基础-回调函数(callback)的更多相关文章

  1. js回调函数(callback)理解

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

  2. JS回调函数(callback)

    在使用Jquery的时候,用到Callback(),回调函数的概念.而且很多. 比如: $.ajax({ url:"test.json", type: "GET" ...

  3. 理解javascript中的回调函数(callback)

    以下内容来源于:http://www.jb51.net/article/54641.htm 最近在看 express,满眼看去,到处是以函数作为参数的回调函数的使用.如果这个概念理解不了,nodejs ...

  4. 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

  5. 理解javascript中的回调函数(callback)【转】

    在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实 ...

  6. C++回调函数(callback)的使用

    什么是回调函数(callback)    模块A有一个函数foo,他向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事 ...

  7. 回调函数callback使用例子

    代码如下: <!DOCTYPE HTML> <html> <head> <meta charset="GBK" /> <tit ...

  8. java基础--常用函数总结

    java基础--常用函数总结 2019-3-16-23:28:01-----云林原创 1.split()字符串分割函数 将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.Math.flo ...

  9. [转]C++回调函数(callback)的使用

    原文地址:http://blog.sina.com.cn/s/blog_6568e7880100p77y.html 什么是回调函数(callback)    模块A有一个函数foo,他向模块B传递fo ...

随机推荐

  1. MathExam6378

    我的第一个程序 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 15 10 • Estima ...

  2. 第二阶段每日站立会议Fifth Day

    昨天继续调试手机界面,解决了Tomcat服务可以打开,但是无法连接到数据库的问题 今天做最后的准备阶段,完善卖家后台管理界面

  3. b7

    组员:陈锦谋 过去两天完成了哪些任务: 细节最后完善 明日计划: 无 还剩下哪些任务: 无 有哪些困难: 暂无 有哪些收获和疑问: 无

  4. The last time the sprint(最后一个冲刺)

    经过一两个月的努力,我们终于是做出来了一点东西,从一开始接触这个项目开始,从完全不知道怎么去入手到跌跌碰碰,再到现在可以拿出来一点东西给别人看,我觉得很开心,或许我的这个成品在别人眼中并不算是什么,但 ...

  5. Answer the questions(回答自己的问题)

    第一章: 问题:我们现在学了这个专业,如果想全面去了解,应该还要学习哪些课程? 回答:其实软件工程只是一个比较大的范畴,以后如果要出去工作,我们还要细分,比如说开发安卓,开发游戏,web架构方面等很多 ...

  6. python learning Functional Programming.py

    print(abs(-10)) # 函数可以是变量 f = abs f(-10) def add(x,y,f): return f(x) + f(y) x = -5 y = 6 f = abs # 简 ...

  7. Week2-作业1——关于阅读《构建之法》第1、2、16章的疑问与感悟

    关于阅读<构建之法>第1.2.16章的疑问与感悟 术语解释: 第2章,23页 什么是代码覆盖率? ———————————————————— 在测试中的代码覆盖率是指,你运行测试用例后,走过 ...

  8. EditorUtility类的说明

    SetDirty这个函数告诉引擎,相关对象所属的Prefab已经发生更改. IsPersistent用于判定对象是否是被保存在硬盘中 DisplayDialog显示一个对话框,有OK,Cancel按钮 ...

  9. 程序开发入门工具之CodeBlocks

    程序开发基础工具之CodeBlocks 作为程序开发工作者,我们会接触很多的程序开发软件:但实用以及容易掌握的程序开发软件对于初学者的学习能力是有一定的加成的.今天我就作为一个程序开发者给大家推荐一个 ...

  10. Beta阶段团队项目开发篇章1

    例会时间:2016.12.1 例会照片: 个人工作: 任务分配: 组员 任务内容 李文涛 编写并发布调查问卷 姬索肇 审核并传播调查问卷 韩慧敏 审核并传播调查问卷 任务截止时间 2016.12.4 ...