您的位置:首页 > 编程语言 > Java开发

关于c和java中回调函数的说明

2014-09-02 22:05 169 查看

起因:

        最近在看android的源码,发现其中用到了很多回调函数的机制(入消息处理中的onReceive()等),认为有必要理解一下回调机制。

        通过上网查资料才发现回调函数在各种语言中用的都是比较多的,这里对 “C/JAVA” 这两种比较有代表性的语言中的回调函数做一下说明。首先说明什么是回调(对两种语言都适用),然后就C语言中的函数指针实现和JAVA语言中的接口实现分别举例进行说明。

回调函数概述:

        所谓回调函数就是在A调用B中函数的时候将A中函数的调用方式(非函数名)告诉B,这样B就可以反过来调用A中的函数,而由于调用的并非具体的函数名,这就提供了A和B 交互极大的灵活性。

C中回调函数的实现:

        C中是通过函数指针来实现回调函数的。下面这个例子中通过main()函数调用了dosomework()函数,而在dosomework()函数中则分别调用了dogshout()和catshout()两个函数。其中对dogshout()和catshout()两个函数的调用即为回调。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

        #include <stdio.h>

        void dogshout ( ){

                     char *shouttype = "wangwang !!!";

                     printf("%s\n",shouttype);             

         }

       void catshout ( ){

                     char *shouttype = "miaomiao !!!";

                     printf("%s\n",shouttype);             

         }

       void dosomework(void (*worktype) ()){

                      printf("i want to do some work \n");

                      worktype(); 

        }     

       int main(){

                      int i;   

                     dosomework(dogshout);

                     dosomework(catshout);

       }

////////////////////////////////////////////////////////////////////////////////////////////////////////////////

       这种回调的优点在于:1、dosomework()是针对函数指针来实现的,我们可以为其传递不同的函数指针来完成不同的工作,而无需改变dosomework()函数所做的工作。2、再者如果dosomework()函数中所作的工作较多的话,则其对worktype()函数(即回调函数)的调用时机(以至是否调用)都尤其内部的逻辑自己来判断,而无需直接指定。

JAVA 中回调函数的实现

       通过以上C中回调函数的实现可以看出通过指针的方式来实现回调函数是比较好理解的,然而JAVA中却没有指针的概念,那么JAVA中是怎么实现回调函数的呢? 答案是JAVA中采取了与C中完全不同的机制来实现回调函数,即接口函数的机制。下面给出一个JAVA中实现回调函数的例子。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 //定义接口    

public interface dosomework {
     public void shout();
}
//定义被调用的类
public class workcall {
     dosomework mywork;
     workcall(dosomework mywork){
       
this.mywork = mywork;
     }
     protected void todowork(){
         mywork.shout();

     }
 
}
//定义调用类

public class workcaller{
    public static void main(String[] args){
        workcall dogshout = new workcall(
           
new dosomework(){
               
public void shout(){
                   
System.out.println("wangwang!!!");
               }
       
});
        dogshout.todowork();
    }
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

       上面这个例子很好的说明了JAVA中 回调函数的实现机制:即首先定义一个接口,在其中说明我们需要回调的函数;接着,在被调用的类中声明一个接口对象;最后在调用的类中将实现了接口函数的接口对象传入被调用的类中,并调用被调用的类中的函数。如此便实现了从被调用类(workcall)中回调调用类(workcaller)中函数的目的。

        这种实现的优点在于我们可以创建好被调用类中所完成工作的框架,而其中所完成的具体工作则在调用类中进行指定,这样极大地提高了编程的灵活性。

        以上便完成了对C和JAVA中回调机制的说明。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: