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. 如何知道一个App的包名呢

    包名(Package name)是Android系统中判断一个APP的唯一标识 记录我获取包名的几种方式 方法一:通过cmd命令,打开你要获取包名的APP 1.adb shell 2.dumpsys ...

  2. 150314 解决老师给二柱子出的问题 之 ver1.0

    一个晚上的成果,效果捉鸡,代码很乱.暂定ver1.0 //Powered by LZR! 2015.3.14#include<iostream> #include<stdio.h&g ...

  3. 读《构建之法》一、二、十六章随笔a

    第一章    概论 “软件团队要从需求分析开始,把合适的需求梳理出来,然后逐步开展后续工作”:——p3 问题:好的用户体验要从软件分析开始,那么软件分析仅仅是从用户的需求出发吗? 我的看法:需求分析是 ...

  4. quartusII13.0使用教程

    1.新建工程项目,填写项目存储路径和工程名,不要出现中文路径 2.添加已存在文件(可选),在[File name]下选择已经存在的工程项目,利用[Add]或[Add all]命令添加文件到新工程,点击 ...

  5. java中注解的使用与实例

    1.spring中的一段代码: @Target(ElementType.PARAMETER)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @ ...

  6. struts2的运行原理以及底层的工作机制

    1 请求,请求路径是/login(发起请求,被filter拦截) 2 DispatcherFilter 3 获取当前请求的路径 通过request对象 request.getServletPath 4 ...

  7. [转帖]HTTPS的简单说明

    HTTPS(全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTT ...

  8. [转帖]HTTPS系列干货(一):HTTPS 原理详解

    HTTPS系列干货(一):HTTPS 原理详解 https://tech.upyun.com/article/192/HTTPS%E7%B3%BB%E5%88%97%E5%B9%B2%E8%B4%A7 ...

  9. 利用stream对map集合进行过滤

    最近公司在大张旗鼓的进行代码审核,从中也发现自己写代码的不好习惯.一次无意的点到了公司封装的对map集合过滤的方法,发现了stream.于是研究了一下.并对原有的代码再次结合Optional进行重构下 ...

  10. 使用 TClientDataSet(1)

    本例效果图: 代码文件: unit Unit1; interface uses   Windows, Messages, SysUtils, Variants, Classes, Graphics, ...