C语言中回调函数(Callback Function)解释:
函数是用来被调用的,我们调用函数的方法有两种:
· 直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Called)。
· 间接调用:在函数A的函数体里并不出现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行——听起来很酷,是吧!
比起直接调用来,间接调用的确麻烦,那为什么还要使用间接调用呢?原因很简单——直接调用把函数名都写进
函数体了,经过编译器那么一编译,板上钉钉,A注定调用的是B了,这样的程序只能按照程序员事先设计好的流
程执行下去,太呆板了。此时,间接调用的巨大灵活性就显现出来了。想一想,如果p是函数A的一个参数(参数
是变量,是变量就可以变吗!),那么程序的最终用户完全可以通过操作来改变p的指向——这样,A在通过p调
用函数的时候就有机会调用到不同的函数,这样程序的实用性和扩展性就强多了。
java中的直接调用:
View Code
public class TestCallBack { public static void methodB(){ for(int i=0;i<100000000;i++){} } //主叫函数 public void methodA(){ long begin = System.currentTimeMillis(); methodB();//被叫函数 long end = System.currentTimeMillis(); System.out.println("[use time]:"+begin+"#"+end+"#"+(end-begin)); } public static void main(String[] args) { TestCallBack t = new TestCallBack(); t.methodA(); } }
java中的间接调用:
定义接口:(必须的,功能类似指针)
//定义回调所需的接口 public interface CallBack{ //执行回调操作的方法 void execute(); }
View Code
public class TestCallBack { public void methodA(CallBack callback){ long begin = System.currentTimeMillis(); callback.execute();//执行回调函数 long end = System.currentTimeMillis(); System.out.println("[use time]:"+begin+"#"+end+"#"+(end-begin)); } public static void main(String[] args) { TestCallBack t = new TestCallBack(); t.methodA(new CallBack() { @Override public void execute() { System.out.println("执行任意回调的方法。。。"); } }); } }
什么是回调函数:
一个简单的例子:
系统要调用你的函数,但它不可能知道你的函数的函数名,调用规则,参数列表,所以你必须把这个函数的地址给他,并且遵循一定的调用规则,参数列表,以及返回值。
我们定义了callback函数,在其中写了很多的代码,但我们自己却从来没有调用过它。