黑马程序员技术交流社区

标题: java的回调函数 [打印本页]

作者: HM张健    时间: 2013-4-19 14:53
标题: java的回调函数
java的回调函数是什么,怎么实现的,具体功能是什么
作者: 梁志兵    时间: 2013-4-19 20:48
比如你写了两个类A和B,并且各生成一个对应的实例a 和b ,在a 中有一个方法fa( 此方法只负责生成两个随机数)要调用b中的一个方法fb(此方法对两个数进行求各) 来进行求和,fb求得结果后要调用a的另一个方法ffa(此方法用于显示求得的结果),这时ffa就叫作回调函数,(反回来调用一下的意思)为什么要这么麻烦呢,如果fb直接返回结果不好吗,试想如果fb执行时间较长,那么fa就会一直等结果而导致fa不往下执行了,此时如果用回调这个功能实现,由于 回调函数一般是由系统异步调用的,方法fa调用fb后就不用等而直接往下执行,比如可以再生成两随机数给fb,fb会依次得到结果后通过回调机制来调用ffa显示出来,其实就是为实现生成随机数和计算随机数的异步执行。好象fa和fb是两个独立执行的线程,提高程序效率。
作者: 黑马-张明    时间: 2013-4-20 11:07
本帖最后由 黑马-张明 于 2013-4-20 11:12 编辑

     所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B,对于C来说,这个B便叫做回调函数。例如Win32下的窗口过程函数就是一个典型的回调函数。一般说来,C不会自己调用B,C提供B的目的就是让S来调用它,而且是C不得不提供。由于S并不知道C提供的B姓甚名谁,所以S会约定B的接口规范(函数原型),然后由C提前通过S的一个函数R告诉S自己将要使用B函数,这个过程称为回调函数的注册,R称为注册函数。Web Service以及Java的RMI都用到回调机制,可以访问远程服务器程序。
    下面举个通俗的例子:
    某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
通过上面个人感觉到回调更多的应用就是结合异步。比如:Ajax中js通过组件和服务器的异步通信。
例:
    程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序。程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法。目的达到。在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数。
     假设我是程序员A,以下是我的程序a:


[java] view plaincopyprint?



  

     我还需要定义一个接口,以便程序员B根据我的定义编写程序实现接口。

[java] view plaincopyprint?





     于是,程序员B只需要实现这个接口就能达到回调的目的了:

[java] view plaincopyprint?




作者: HM张健    时间: 2013-4-20 23:47
黑马-张明 发表于 2013-4-20 11:07
所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B, ...

额 难道碰到同好啦  你的头像是魔法使之夜吧
作者: 黑马-张明    时间: 2013-4-21 01:08
HM张健 发表于 2013-4-20 23:47
额 难道碰到同好啦  你的头像是魔法使之夜吧

没错啊金闪闪!TYPE-MOON,吾王驾到
作者: 〃Mr.Zぐ    时间: 2013-4-22 14:54
public class A {
        int value = 1001;

        public A() {// A的构造函数,执行B的exec()方法,里面又带有对A的getValue()方法调用,这个就叫做回调
                B b = new B(this);
                b.exec();
        }

        public int getValue() {
                return value;
        }

        public static void main(String[] args) {
                new A();//构造函数里已经发生了回调,所以不需要更多的代码
        }
}

class B {
        private A a;

        public B(A a) {
                this.a = a;
        }

        public void exec() {
                System.out.println(a.getValue());// 这里调用了a的getValue()方法
        }
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2