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. WebGL学习笔记七点一

    第六章讲的是一些GL的一些语法,前面已经涉及,学习时直接跳过,来看第七章,第七章是真正意义的三维立体的出现,其实图形绘制方法是差不多的,就是Z坐标此时不再为0,所以很容易能构造出一些立体图形,但是立体 ...

  2. AttributeError: module ‘tensorflow.python.ops.nn’ has no attribute ‘leaky_relu’

    #AttributeError: module 'tensorflow.python.ops.nn' has no attribute 'leaky_relu' 的原因主要是版本的问题 解决方法是更新 ...

  3. HDU 4418 Time travel 期望dp+dfs+高斯消元

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4418 Time travel Time Limit: 2000/1000 MS (Java/Othe ...

  4. 如何解决abd.exe已停止工作

     打开电脑,右键点击属性会出现如下界面: 点击左边高级系统设置:将会出现如下界面: 点击环境变量,点编辑. 把环境变量中的 ANDROID_ADB_SERVER_PORT 改成1122以后还遇到这个问 ...

  5. Alpha版本冲刺(六)

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...

  6. UTC时间与北京时间

    经常混淆于此,特地研究了一下,记录在此以备忘. 整个地球分为二十四时区,每个时区都有自己的本地时间.在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal ...

  7. vue 实战 遇到问题记录

    vue-router  配置路由遇到问题 1.一个 new Router({ routes:[ { path:'/', component:Good    ///不要写成components  否则报 ...

  8. Selenium_IDE的基本使用及脚本解析

    Selenium确实还是很强大的.根据我以往的经验,这个东西在web测试里的作用还是相当大的.经过近期研究,暂时对基本运作方式有了一定了 解,依旧找个实例记录一下.本段脚本实现的是网易返现个人中心登录 ...

  9. Windows10 桌面显示 我的电脑

    桌面上面有我的电脑还是非常方便的 但是 不激活有时候没法选择: 方法 桌面空白处右键---个性化 然后在 个性化- 主题- 桌面图标设置 增加即可.

  10. .Net iTextSharp 生成pdf

    拿别人例子 public ActionResult index() { var ms = new MemoryStream(); #region CreatePDF Document document ...