#Java回调函数理解和应用
所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的。
在未理解之前,我也是一脸懵逼,等我理解之后,发现和Javascript的回调函数原理基本是一样,一个是将对象作为参数传递,一个是将函数作为参数传递。
从维基百科上面摘抄定义:
在计算机程序设计中,回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。

举个例子有个程序员和一个项目经理,XX项目经理向程序员安排任务让程序员去完成,程序员获得任务并记下是XX项目经理安排的任务,程序员将任务完成后,获取通知XX项目经理的方式,发送一条信息通知项目经理任务已经完成。

下面上实例:
新建一个项目经理类:

public class ProjectManager {private String name;public ProjectManager(String name){this.name =name;}public String getName(){return this.name;}/*** 通知方法* @param msg*/public void noticeMe(String msg){System.err.println(msg);}/*** 安排任务* @param task*/public void arrange(String task){//安排程序员干活new Programmer().receiveTask(task, this);}public void doOtherWork(){System.err.println("项目经理干其他事情...");}}

新建一个程序员类:


import java.util.concurrent.TimeUnit;public class Programmer {//记下是XX项目经理,而不是其他项目经理ProjectManager manager;/**程序员接受任务*/public void receiveTask(String task,ProjectManager manager){this.manager = manager;try {//程序员开始执行任务this.excuteTask(task);} catch (InterruptedException e) {e.printStackTrace();}}/**执行任务*/private void excuteTask(String task) throws InterruptedException{System.err.println("执行项目经理:"+manager.getName()+"安排的任务-->"+task);//任务执行中TimeUnit.SECONDS.sleep(1);//任务完成this.finished(task);}/**任务完成*/public void finished(String task){//获取通知项目经理的方法,并发出通知//进行函数回调,这里还不算真正的回调manager.noticeMe(manager.getName()+"你好,你安排的任务"+task+"已经完成!");}}

新建测试类:

public class CallbackTest {/*** @param args*/public static void main(String[] args) {ProjectManager prjMgr = new ProjectManager("王响");prjMgr.arrange("今晚完成数据库设计...");prjMgr.doOtherWork();}}

运行结果:

但实际上,项目经理可能有好多个联系方式,有些方式可能是无效的。那我怎样才能知道哪个才是真确的通知方式呢?那就需要项目经理指定哪个方式是正确的,这样程序员也只要记住联系方式即可。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。
定义一个通知接口:

public interface Notice {public void noticeMe(String msg);
}

改写项目经理类:

public class ProjectManager implements Notice{private String name;public ProjectManager(String name)
{this.name =name;
}public String getName()
{
return this.name;
}/*** 通知方法* @param msg*/
@Override
public void noticeMe(String msg)
{
System.err.println(msg);
}/*** 安排任务* @param task*/
public void arrange(String task)
{
//安排程序员干活
new Programmer().receiveTask(task, this);
}public void doOtherWork()
{
System.err.println("项目经理干其他事情...");
}}

改写程序员类

import java.util.concurrent.TimeUnit;public class Programmer{//指定了通知方式Notice notice;/**程序员接受任务*/public void receiveTask(String task,Notice notice){this.notice = notice;try {//程序员开始执行任务this.excuteTask(task);} catch (InterruptedException e) {e.printStackTrace();}}/**执行任务*/private void excuteTask(String task) throws InterruptedException{System.err.println("执行项目经理:安排的任务-->"+task);//任务执行中TimeUnit.SECONDS.sleep(1);//任务完成this.finished(task);}/**任务完成*/public void finished(String task){//获取通知项目经理的方法,并发出通知//进行回调通知notice.noticeMe("你好,你安排的任务"+task+"已经完成!");}}

那我们为什么要使用回调函数呢?
简单来说就是,我自己活太多,或者有其他的事需要做,自己不想做,就把这个活分配给别人去完成,并把完成的结果告诉我就行了。

如果看到这里你若还没有懂的话,那我换一种方式表达:回调函数就是别人要调用我的时候,我要告诉别人我这个方法的地址在那里,然后别人直接找这个地址就行,不用再去向系统申请内存地址然后去找(找的过程中,会涉及很多询问,就像我平常生活中找一个不熟悉的人时,就会去询问一些人,告诉被询问者“他是谁,他在哪”)这个方法在哪里。

Java回调函数理解和应用相关推荐

  1. Java 回调函数的理解

    以下是我对java回调函数的理解,希望对各位有帮助. 简而言之,假设有两个类A与B,还有一个回调接口C(有一个c方法).其中A类持有一个B类对象作为属性和拥有一个a方法,并实现了接口C,所以A类中就有 ...

  2. Java 回调函数详解及使用

    Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通 ...

  3. Android回调函数理解

    Android回调函数理解,比如我用一个activity去做显示下载进度的一个进度条,但是下载是另外一个B类来做的,这个时候我Activity获取下载的进度就可以提供一个回调接口,然后让下载类来回调就 ...

  4. nodejs回调函数理解

    回调实例 问题:想要得到一秒后 计算出的结果 //错误写法function add(x,y) {console.log(1);setTimeout(function () {console.log(2 ...

  5. [实战]java回调函数

    下面使用java回调函数来实现一个测试函数运行时间的工具类: 如果我们要测试一个类的方法的执行时间,通常我们会这样做: java 代码 public   class  TestObject { /** ...

  6. java反射回调函数_用J2V8注册Java回调函数

    J2V8是一套针对谷歌的V8 JavaScript引擎的Java绑定.J2V8的开发为Android平台带来了高效的Javascript的执行环境,taris.js 就是基于J2V8开发的.J2V8同 ...

  7. Java 回调函数(传统方法和lambda方法)-一个例子秒懂

    原文地址为: Java 回调函数(传统方法和lambda方法)-一个例子秒懂 背景: 想写一个工具类 Tool.java ,其中方法 public void readOneLine() 负责一行一行地 ...

  8. Java回调函数的理解

    所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数.例如Win32下的窗口过程函数就是一个典型的回调函数.一般说来,C ...

  9. Java回调函数使用

    C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: l         直接调用:在函数A的函数体里通过书写函数B ...

最新文章

  1. C语言经典算法 21-30
  2. mysql 查询字段中是否存在空格的_mysql查询字段中带空格的值的sql语句
  3. Android—WebView与JS交互
  4. opacity用法:
  5. 10.3 考试 (考得不好)
  6. 信息学奥赛一本通 1967:【14NOIP普及组】螺旋矩阵 | 洛谷 P2239 [NOIP2014 普及组] 螺旋矩阵
  7. 13-mysql-子查询
  8. 首秀双折叠屏手机却被友商炮轰 小米回应:悍然碰瓷!
  9. spring data整合elasticsearch的applicationContext.xml文件模板
  10. 嵌入式linux应用开发完全手册(一)
  11. war 包,在Windows环境,如何解压
  12. 百度人脸识别Java版
  13. 深入浅出聊PLC技术,无线智能家居瞬间「不香了」?
  14. Google Cloud API设计指南
  15. c语言投票程序设计,C语言课程设计-投票程序设计.doc
  16. 薅羊毛赚钱,也可操作
  17. 短信验证php_php如何实现短信验证
  18. 使用pdfbox把PDF转换成图片
  19. 网页进服务器,如何通过网页进去云服务器
  20. 《经济学人》深度报道:DeepMind和谷歌的AI拉锯战

热门文章

  1. 【PCIE703】XCKU060+海思视频处理器HI3531DV200-ARM的高性能综合视频图像处理平台设计资料及调试经验
  2. 记录一下蚂蚁金服的电话面试
  3. 火墙-firewalld
  4. 简报 | 韩国釜山发行地区性数字货币,力促自由贸易区发展
  5. 暗影精灵3安装无线网卡驱动(ubuntu16.04)
  6. 【短信插件】JSHOP_V2.4系统短信功能对接流程
  7. JStorm-介绍-阿云栖社区
  8. android leakcanary 源码分析,LeakCanary源码浅析
  9. 查壳去壳和加壳的基本原理
  10. 计算机三级网络技术ppt介绍,计算机三级网络技术课件.ppt