java什么是回调
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础,因此,下面我们着重讨论回调机制在不同软件架构中的实现。
Java的回调简单的说,回调函数就是通过其指针来调用的函数(这句话确实够简单的,下面会详细的描述);回调函数不会被自己所在的对象调用,只会在调用别人的方法的时候反过来被调用。我们知道android程序是通过java来实现的,java中是没指针的,那么怎么实现回调呢,通过接口、或者抽象类。
实现步骤:
1、定义一个接口,其中包含一个方法a;
2、定义一个实现这个接口的类A,实现方法 a(此处的a就是传说中的回调函数,此处不一定要在声明类的时候实现这个接口,也可以在类中去实现这个接口,我会分别举例子)
3、定义一个类B,在B中定义一个方法b,b以第一步中定义的接口作为参数;
4、在A中调用方法b,把自己作为参数传递进去;
5、在B中通过传递进来的参数A(实现了接口)去调用a,这就实现了回调;
至于为什么要使用回调函数呢?在一位大神的博客里面看到这句话“回调功能是实现功能和定义分离的一种手段,是一种松耦合的设计思想”,有的人就会问了,为什么要实现定义和功能分离呢?我们在刚开始接触面向对象的这个概念的时候,应该经常听到这种说法:面向对象是要实现高内聚、低耦合,方便程序的修改和扩展。我觉得函数的定义和功能的分离应该也是这个道理吧。在下面的例子中我会在注释中从另外一个方面说明回调函数的必要性。
其次,看代码吧
代码1,在声明类的时候实现接口:
[java] view plaincopypackage com.callback;
/* 第一步:定义一个接口,其中包含一个方法a*/
public interface Callback {
public void a(int i);
}
[java] view plaincopypackage com.callback;
/* 第二步:定义一个实现这个接口的类A,实现方法 a*/
public class A implements Callback{
static B b = new B();
/* 此处为什么要定义一个常量呢?
* 我是想从另一个方面(松耦合的设计思想算是一方面吧)说明回调方法的必要性,
* 暂时先不用管,后面会继续说明的*/
final int Constant = 1;
@Override
/* 回调方法不会在A类中被调用的,注意看待会他会在哪被调用 */
public void a(int result) {
// TODO Auto-generated method stub
System.out.println(result);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
/* 第四步:在A中调用方法b,把自己作为参数传递进去,
* 此处A中的常量Constant,也会随着A被传到B中*/
b.b(new A());
}
}