Java回调函数

来源:互联网 发布:mac清理软件破解版 编辑:程序博客网 时间:2024/05/29 09:32

今天读了几篇关于回调函数的文章,现在总结一下:

函数是用来被调用的,我们调用函数的方法有两种:

1、 直接调用:在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行。这里,A称为“主叫函数”(Caller),B称为“被叫函数”(Callee);
2、 间接调用:在函数A的函数体里并不出现函数B的函数名,而是使用指向函数B的函数指针p来使内存中属于函数B的代码片断得以执行。

比起直接调用来,间接调用的确麻烦,那为什么还要使用间接调用呢?原因很简单——直接调用把函数名都写进函数体了,经过编译器那么一编译,板上钉钉,A注定调用的是B了,这样的程序只能按照程序员事先设计好的流程执行下去,太呆板了。此时,间接调用的巨大灵活性就显现出来了。想一想,如果p是函数A的一个指针参数(参数是变量),那么程序的最终用户完全可以通过操作来改变p的指向。这样,A在通过p调用函数的时候就有机会调用到不同的函数,这样程序的实用性和扩展性就强多了。在java中没有指针,这时便可以使用接口(interface)来实现自己的回调函数。

定义:回调函数,是指通过函数参数传递到其它代码的某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。

很明显定义中说明了使用场景,即底层调用高层。其实回调和API非常接近,他们的共性都是跨层调用的函数。但区别是API是低层提供给高层的调用,即高层调用底层,一般这个函数对高层都是已知的。而回调正好相反,他是高层提供给底层的调用,对于低层他是未知的,必须由高层进行安装。

代码:

Server端:

public class Server{    public interface ServerCallback    {        public void dosth();    }    // 构造函数中直接调用了接口方法    public Server(ServerCallback callback)    {        callback.dosth();    }}

Client端:

public class Client{    public static void main(String args[])    {        new Server(new MyServerCallback());    }    private static class MyServerCallback implements ServerCallback    {        @Override        public void dosth()        {            System.out.println("客户点回调服务器端,低层访问高层,区别于API");        }    }}

参考:http://www.cnblogs.com/wangchenyang/archive/2011/08/16/2140744.html,这是篇不错的博文

0 0