Java 回调函数基础知识
来源:互联网 发布:ip与mac绑定是什么意思 编辑:程序博客网 时间:2024/05/16 15:07
C语言中回调函数解释
回调函数(CallbackFunction)是怎样一种函数呢?
函数是用来被调用的,我们调用函数的方法有两种:
- 直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee)。
- 间接调用:在函数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中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。”
使用技巧:定一个接口,在接口中声明我们想调用的方法。在另一个方法中注册刚定义的回调接口.
第一步:李四定义的回调接口
/**
* @since 2012-02-02
* @desc 定义回调接口
*/
public interface CallBackInterface{
public void doSome();
public void exectueMethod();
}
第二步:李四编写的业务处理程序
/**
* @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;
}
}
第三步:张三实现李四规定的接口
/**
* @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
源文档 <http://www.cnblogs.com/wangchenyang/archive/2011/08/16/2140744.html>
- Java 回调函数基础知识
- 【java 基础知识补充】Java回调函数
- Java基础知识(二) 回调函数
- JAVA回调函数
- java回调函数
- Java回调函数
- Java 回调函数
- java回调函数
- Java 回调函数
- Java 回调函数
- Java回调函数
- Java回调函数
- java回调函数
- Java 回调函数
- Java 回调函数
- java回调函数
- Java 回调函数
- java 回调函数
- 动态分配内存,不释放,程序退出后会被系统回收吗
- noip2005 一维采药---恰 (背包dp)
- Centos7最小化安装
- 一、 模板方法(Template Method)模式
- OnTouchEvent事件处理
- Java 回调函数基础知识
- 文档管理系统介绍
- BCB用FTP上传下载
- ContactInfo
- 多重背包的二进制转化
- 仿射坐标公式推导
- AsyncHttpClient 官网的东西
- POJ 1185 炮兵阵地(状压DP)
- 用link文件安装Eclipse插件