您的位置:首页 > 编程语言 > Java开发

java中回调的理解

2018-03-04 16:59 155 查看
java中不同模块之间相互调用分为三种,同步调用,异步调用,回调
以老师提问学生问题举例
1.同步调用是最常见的,就是类A中的方法执行中国调用类B的方法,知道类B中的方法执行完成后,类A继续执行。
就相当于 老师提问学生问题,等学生回答完成以后,老师继续做其他事情,老师并不知道学生问题的答案。
2.异步调用,还是类A中的方法调用类B中的方法,但是在这个类B方法上新建一个线程,类A中的方法继续执行其他语句。
就相当于老师提问学生问题,学生在回答的过程中,并不影响老师做其他事情。
3.回调,类A中的方法调用类B的方法,同时,将类A的对象作为参数传递给类B方法,这样,类B的方法在执行的过程中,就可以在调用类A中的方法,这样,就形成了回调。回调指的就是类A调用类B中的方法,但是类B又反过来调用类A中的方法。这个模式能够实现的核心就是当类A调用类B的方法的同时,将类A的对象作为参数传递给了被调用者。
就相当于,老师提问学生问题,学生在回答问题的过程中,让老师给一点提示,让后学生继续作答。
我的理解就感觉回调就是互调的感觉,我问A借钱,B让给先去搬回砖,我搬完后,B把钱借给我,然后我又去做自己的事情了。
接口回调就是对回调的升级,是在回调的基础上加了多态。
举例,老师提问学生问题,把对象传给了学生,学生之所以能够接收老师这个对象,因为学生这个的方法中的参数为老师类,如果把老师类中的问问题这个方法抽象成一个接口,学生回答问题的方法的参数为这个接口,那么不仅仅是老师可以问学生问题了,任何实现这个接口的人都可以问学生问题。
这样说可能有点绕,下面,我用代码的方式让大家理解接口回调。
//首先我需要一个问问题的接口,其中有问问题的方法,因为需求是问学生问题,所以我们这里的参数是学生对象
public iterfance AskQuestion(){
void ask(Student s);
}
//定义一个老师类,实现这个问问题的接口
public class Teacher implements AskQuestion(){
//老师问问题的方法
public void ask (Student student){
student.answer(this);//在this这里变实现了回调

//老师解释的方法
public void explain(){
System.out.println("老师给学生解释问题");


//定义一个学生类,他有回答问题的方法
public class Student{
public class answer(AskQuestion Person){
System.out.println("我回答不出来,想请老师帮忙");
person.explain();//此处实现了回调。
System.out.println("经过老师的帮忙,我解决了问题");


//新建一个测试类
pubic class Test{
public static  void  main(String[] args){
Student s = new Student();
Teacher t = new Teacher();
t.ask(s);
}
}
//打印结果
我回答不出来,想请老师帮忙
老师给学生解释问题
经过老师的帮忙,我解决了问题

总结:
以上便是我对接口回调的理解,接口回调的本质就是调用者将自己的对象传给被调用者,被调用者化被动为主动,反过来调用之前调用他的人。
在学习过程中,文件过滤器以及动态代理都使用了回调的思想。
文件过滤器:列出文件的方法需要一个过滤器进行过滤,而过滤器又需要文件对象进行判断,这样就形成了回调
动态代理:super.h.invoke(this, m5, new Object[]{var1});,这里代理对象的方法找那个执行了处理器调用对象的invoke方法,invoke方法中传递了代理人对象this,在进行动态代理的时候可以使用被代理人的this进行一些操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  接口回调 回调