C语言中回调函数解释:
回调函数(Callback Function)是怎样一种函数呢?
函数是用来被调用的,我们调用函数的方法有两种:
l         直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee)。
l         间接调用:在函数A的函数体里并不出现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行——听起来很酷,是吧。
比起直接调用来,间接调用的确麻烦,那为什么还要使用间接调用呢?原因很简单——直接调用把函数名都写进函数体了,经过编译器那么一编译,板上钉钉,A注定调用的是B了,这样的程序只能按照程序员事先设计好的流程执行下去,太呆板了。此时,间接调用的巨大灵活性就显现出来了。想一想,如果p是函数A的一个参数(参数是变量,是变量就可以变吗!),那么程序的最终用户完全可以通过操作来改变p的指向——这样,A在通过p调用函数的时候就有机会调用到不同的函数,这样程序的实用性和扩展性就强多了。

在WINDOWS中,程序员想让系统DLL调用自己编写的一个方法,于是利用DLL当中回调函数(CALLBACK)的接口来编写程序,使它调用,这个就称为回调。在调用接口时,需要严格的按照定义的参数和方法调用,并且需要处理函数的异步,否则会导致程序的崩溃。这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。

正常情况下开发人员使用已经定义好的API,这个过程叫Call。但是有时这样不能满足需求,就需要程序员注册自己的程序,然后让事先定义好多API在合适的时候调用注册的方法,这叫CallBack。

“通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写等待别人(张三)调用的函数,在C语言中,回调函数通常通过函数指针来传递;在Java中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。

使用技巧:定一个接口,在接口中声明我们想调用的方法。

在另一个方法中注册刚定义的回调接口

第一步:定义回调接口
package com.callback;
/**
 * @since 2012-02-02
 * @desc 定义回调接口
 */
public interface CallBackInterface {
    public void doSome(); 
     
    public void exectueMethod();
}

第二步:李四编写的程序
package com.callback;
/**
 * @since 2012-02-02
 * @desc 李四
 */
public class MethodB {
    public double getTime(CallBackInterface callBack) {
        long start = System.currentTimeMillis();
        callBack.exectueMethod();
        long end = System.currentTimeMillis();
        System.out.println("cost time=" + (end - start));
        return end - start;
    }
}

  第三步:张三实现李四规定的接口

package com.callback;
/**
 * @since 2012-02-02
 * @desc 张三
 */
public class MethodA {
    public static void main(String args[]){
        MethodB b=new MethodB();
        //返回值d只和MethodB有关,和接口中方法的返回值无关
        double d=b.getTime(new CallBackInterface() {
             
            //张三实现了李四定义的接口
            public void exectueMethod() {
                new MethodA().testMethod();
            }
             
            @Override
            public void doSome() {
                 
            }
        });
        System.out.println("d="+d);
    }
     
    public void testMethod(){
        for(int i=0;i<10000;i++){
            System.out.print("");
        }
    }
}

  输出结果:

cost time=31
d=31.0

理解“回调函数”

所谓回调,就是客户程序CLIENT调用服务程序SERVER中的某个函数SA,然后SERVER又在某个时候反过来调用CLIENT中的某个函数CB,对于CLIENT来说,这个CB便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。 一般说来,CLIENT不会自己调用CB,CLIENT提供CB的目的就是让SERVER来调用它,而且是CLIENT不得不提供。由于SERVER并不知道CLIENT提供的CB叫甚名谁,所以SERVER会约定CB的接口规范(函数原型),然后由CLIENT提前通过SERVER的一个函数R告诉SERVER自己将要使用CB函数,这个过程称为回调函数的注册,R称为注册函数。Web SERVERerviCliente以及Java的RMI都用到回调机制,可以访问远程服务器程序。 

下面举个通俗的例子: 某天,我打电话向你请教问题,当然是个难题,:),你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。 通过上面个人感觉到回调函数更多的应用就是结合异步。比如:ajax中jServer通过组件和服务器的异步通信。 

什么是回调函数 

精妙比喻:回调函数还真有点像您随身带的BP机:告诉别人号码,在它有事情时Call您 回调用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调,例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。 其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,一般这个函数对高层都是已知的;而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装,这个安装函数其实就是一个低层提供的API,安装后低层不知道这个回调的名字,但它通过一个函数指针来保存这个回调,在需要调用时,只需引用这个函数指针和相关的参数指针。

其实:回调就是该函数写在高层,低层通过一个函数指针保存这个函数,在某个事件的触发下,低层通过该函数指针调用高层那个函数。
【参考】
http://blog.csdn.net/sweetwxh/article/details/2067139
http://liutiemeng.blog.51cto.com/120361/18874
http://kidult.iteye.com/blog/148982

转载于:https://www.cnblogs.com/hmyprograming/archive/2012/09/26/2704669.html

Java回调函数使用相关推荐

  1. Java 回调函数的理解

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

  2. [实战]java回调函数

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

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

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

  4. Java回调函数理解和应用

    #Java回调函数理解和应用 所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的. 在未理解之前,我也是一脸懵逼,等我理 ...

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

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

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

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

  7. Java回调函数的理解

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

  8. java回调函数_PHP回调函数及匿名函数概念与用法详解

    1.回调函数 PHP的回调函数其实和C.Java等语言的回调函数的作用是一模一样的,都是在主线程执行的过程中,突然跳去执行设置的回调函数: 回调函数执行完毕之后,再回到主线程处理接下来的流程 而在ph ...

  9. java回调函数 final_java中带回调函数的字符串替换,类似js中的replace(rgExp,function)...

    在js中, replace函数的功能很强大,其原型是stringObj.replace(rgExp, replaceText), 而replaceText也可以是返回替换文本的函数.这个功能还是比较好 ...

最新文章

  1. android系统用在什么电脑,手机变电脑的简单操作 适用于所有Android系统的向日葵...
  2. 脑电分析系列[MNE-Python-12]| 注释连续数据
  3. CCF NOI1113 括号匹配
  4. ​MySQL服务器调优思路图
  5. 每日程序C语言36-数组中前面各数顺序向后移动m个位置
  6. AE脚本Swiss Knife Mac 瑞士军刀MG动画制作插件
  7. jqGrid常用方法
  8. 算法学习总结(3)——二叉树数据结构重点知识总结
  9. 知道圆心半径取圆上的经纬度_作为一名台球高手,你应该知道的事
  10. C++基础::自制异常定位器
  11. GitHub 新手教程 四,Git GUI 新手教程(1),OpenSSH Public Key
  12. 限时免费下载《程序员面试宝典》.pdf
  13. Windows 10文件/文件夹正在使用无法删除的6个解决方法
  14. nc工具测试tcp/udp协议
  15. 开源公告|腾讯代码安全指南开源,涉及C/C++、Go等六门编程语言
  16. 鸿蒙OS到底是不是Android套皮?(少bb,看源码!)
  17. 因为Google Chrome中Software Reporter Tool占CPU用过高,我选择转战Microsoft Edge浏览器,电脑至于不卡了
  18. 微信公众号发送模版消息详细过程
  19. javascript屏幕共享
  20. 网络隔离的办公网和互联网,如何安全地进行数据交换?

热门文章

  1. python不等于_Python小课堂|注释+运算符
  2. Python笔记-U2控件操作和操作超时
  3. Android逆向笔记-大部分内购游戏破解思路
  4. Web笔记-移动前端开发笔记
  5. Qt工作笔记-通过 对象树 或 delete this 释放对象
  6. php 智能输入提示插件,PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能_php实例...
  7. python 循环写文件_python-文件操作及循环
  8. python文本内容怎么转换成字典_怎么把照片上的文字转换成文本?照片转换文字神器来了...
  9. sql 除以_SQL题:leetcode Part 1 游戏玩法分析
  10. python队列长度_[python模块]队列queue