回调的思想是:
类A的fa()方法调用类B的fb()方法
类B的fb()方法执行完毕主动(直接或间接)调用类A的callback()方法
在很多的关于回调的讲解中,都涉及到了接口,只是因为一般的回调都使用到了接口。其实java中的回调可以完全不关接口的事,回调只是一种思想,数据传递的一种方式而已,与使用不使用接口无关。
下面的例子中没有涉及到接口,只是简单地展示了回调的思想。这个例子中涉及三个类,类A、类B、Test类。其中只有类A和类B与回调有关,Test类中只有一个主函数,为了测试用。
类A:
package callbacktest;
public class A {
private B b=new B();
private int numnumToBeChanged=7;
public void callMethodInB() { //在该方法中调用了B类中的方法
b.calledByA(this, numnumToBeChanged);
}
public void callbackByB(int numHasChangedByB){//该方法在B中被调用,称为回调方法(Callback)
System.out.print("A中传给B的变量被B改变后的值:"+numHasChangedByB);
}
}
类B:
package callbacktest;
public class B {
public void calledByA(A a, int numToBeChanged){
System.out.println("A中传过来的值:"+numToBeChanged);
numToBeChanged+=2; //将 numToBeChanged加2;
// 在被调用的方法中直接回调,当然也可以通过该类(B)中的其他方法回调
a.callbackByB(numToBeChanged);
}
}
Test类:
package callbacktest;
public class Test {
public static void main(String[] agr) {
A a=new A();
a.callMethodInB();
}
}
运行结果:
上面的例子中类A中的变量numnumToBeChanged
通过调用类B中的方法·b.calledByA(this, numnumToBeChanged);
将类A自身的对象和变量一起传给类B,在类B中改变numnumToBeChanged
的值,然后通过对传进来的类A对象的引用h回调用类A中的方法a.callMethodInB()
(称为回调方法)。
一般在Java中通过回调接口实现回调的方式是:在A中定义一个接口类CallbackInterface,并在A中实现该接口类并创建对象callbackInterface
,然后在A中的方法callMethodInB()
中将该对象传给类B的对象b—b.calledByA(callbackInterface, numnumToBeChanged);
,然后在类B中将回调接口类CallbackInterface中的方法,将数据传递给callbackInterface
,因为callbackInterface
是类A的变量,接口类CallbackInterface是类A的内部类,或者类A本身实现接口CallbackInterface,所以在类A中能够接收到类B通过回调传过来的数据。