A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM张健 中级黑马   /  2013-4-19 14:53  /  1843 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java的回调函数是什么,怎么实现的,具体功能是什么

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

5 个回复

倒序浏览
比如你写了两个类A和B,并且各生成一个对应的实例a 和b ,在a 中有一个方法fa( 此方法只负责生成两个随机数)要调用b中的一个方法fb(此方法对两个数进行求各) 来进行求和,fb求得结果后要调用a的另一个方法ffa(此方法用于显示求得的结果),这时ffa就叫作回调函数,(反回来调用一下的意思)为什么要这么麻烦呢,如果fb直接返回结果不好吗,试想如果fb执行时间较长,那么fa就会一直等结果而导致fa不往下执行了,此时如果用回调这个功能实现,由于 回调函数一般是由系统异步调用的,方法fa调用fb后就不用等而直接往下执行,比如可以再生成两随机数给fb,fb会依次得到结果后通过回调机制来调用ffa显示出来,其实就是为实现生成随机数和计算随机数的异步执行。好象fa和fb是两个独立执行的线程,提高程序效率。

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黑马-张明 于 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?


  • public class Caller  
  • {  
  •     public MyCallInterface mc;  
  •   
  •     public void setCallfuc(MyCallInterface mc)  
  •     {  
  •        this.mc= mc;  
  •     }  
  •   
  •     public void call(){  
  •        this.mc.method();  
  •     }  
  • }      

  

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

[java] view plaincopyprint?


  • public interface MyCallInterface  
  • {  
  •     public void method();  
  •   
  • }  



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

[java] view plaincopyprint?


  • public class B implements MyCallInterface  
  • {  
  •     public void method()  
  •     {  
  •        System.out.println("回调");  
  •     }  
  •   
  •     public static void main(String args[])  
  •     {  
  •        Caller call = new Caller();  
  •        call.setCallfuc(new B());  
  •        call.call();  
  •     }  
  • }

评分

参与人数 1技术分 +2 收起 理由
陈丽莉 + 2

查看全部评分

回复 使用道具 举报
黑马-张明 发表于 2013-4-20 11:07
所谓回调,就是客户程序C调用服务程序S中的某个函数A,然后S又在某个时候反过来调用C中的某个函数B, ...

额 难道碰到同好啦  你的头像是魔法使之夜吧
回复 使用道具 举报
HM张健 发表于 2013-4-20 23:47
额 难道碰到同好啦  你的头像是魔法使之夜吧

没错啊金闪闪!TYPE-MOON,吾王驾到
回复 使用道具 举报
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()方法
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马