Java进阶之回调机制

平时经常听别人讲回调函数,听的我一脸懵逼,到底什么是回调函数,回调函数到底该怎么用?下面举例一一说明。

一、回调机制

所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法。
这样说是不是还是不太理解,其实我刚开始也是这样不理解,看看别人经典的回调方式:
Class A实现接口CallBack callback
Class A中包含一个class B的引用b
Class B有一个参数为callback的方法f(CallBack callback)
A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C
然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D
这样看还是不好理解,还是举个例子来说明吧,例子采用异步加回调:
“有一天李同学遇到一个很难的问题,问题是“1 + 1 = ?”,就打电话问张老师,张老师一下子也不知道,就跟李同学说,等我办完手上的事情,就去想想答案,李同学也不会傻傻的拿着电话去等张老师的答案吧,于是李同学就对张老师说,我还有其他事情,你知道了答案就打我电话告诉我,于是挂了电话,办自己的事情去了,过了一个小时,张老师打李同学的电话,告诉他答案是2”

二、代码示例

1、新建Callback回调接口:定义一个回调方法。

public interface CallBack {
    //回调方法
    public void solve(String result);
}

2、创建学生类(对应上面的class A)

public class Student implements CallBack{
    private Teacher teacher;
    public Student(Teacher teacher) {
        this.teacher = teacher;
    }
    public void askQuestion(final String question){
        System.out.println(teacher.getName() + "好! 我想问个问题:" + question);
        new Thread(new Runnable() {
            @Override
            public void run() {
                teacher.answerQuestion(Student.this, question);//ClassA中调用ClassB的方法
            }
        }).start();
        System.out.println("问完了,我先去做其他事情了");
    }
    @Override
    public void solve(String result) {
        System.out.println(teacher.getName() + "告诉我答案是:" + result);
    }
}

3、创建老师类(对应上面的classB)

public class Teacher {
    private String name;
    public Teacher(String name) {
        this.name = name;
    }
    public String getName(){
        return this.name;
    }
    public void answerQuestion(CallBack callBack, String question){
        System.out.println("有同学提问:" + question);
        //先处理其他事情
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //解答问题
        callBack.solve("2");//调用ClassA的回调方法
    }
}

4、创建测试类:

public class MainTest {
    public static void main(String[] args){
        Teacher missZhang = new Teacher("张老师");
        Student studentLi = new Student(missZhang);
        studentLi .askQuestion("1+1=?");
    }
}

执行结果:
2017-03-17 17:53:101 5342 张老师好! 我想问个问题:1+1=?
2017-03-17 17:53:102 5342 问完了,我先去做其他事情了
2017-03-17 17:53:102 5342 有同学提问:1+1=?
2017-03-17 17:53:102 5347 张老师告诉我答案是:2

参考原文:http://blog.csdn.net/xiaanming/article/details/8703708/
PS: 更多原创技术好文和资料,请关注下方公众号:“测试开发栈”公众号是由具有多年测试、开发经验的老兵们共同管理和运营,旨在分享原创测试、开发相关技术,包括但不限于:测试方向:Web自动化测试、移动端自动化测试、Web服务端测试、接口测试等;开发方向:Java开发、Android开发、前端开发等;期望我们的经验和技术分享能让你每天都成长和进步,早日成为技术大牛~欢迎大家分享和转发我们的文章(分享转发请保留文章出处),以便让更多的朋友关注我们,同时也欢迎加入我们的QQ群交流和提问:427020613

Java进阶之回调机制_第1张图片

你可能感兴趣的:(Java进阶之回调机制)