我问你问我问你的答案——回调

本文通过一个简洁的例子详细解析了回调函数的概念及其应用场景。介绍了回调函数的基本原理,并通过具体代码示例展示了回调函数的工作流程。

这几天朋友在找工作,打电话问了我一些面试意见和可能会问到的问题,其中说到,回调,他虽然也在用,也看了不少解释,就是不知道到底要怎么去解释这个回调。

所以今天,我也谈谈回调,给一个最简洁的小例子。


其实,个人理解的回调就是,
1.需要有两个类(调用者与被调用者,只是这两个类的调用关系比较暧昧)
2.A调用B,让B去完成某个任务
3.但B如果要完成这个任务,需要调用A的一个方法协作(这个方法,就是回调方法)
4.B成功调用了A的方法协作,B最终顺利完成了任务


本例的情景是这样的:

A问B:某个数的10次方是多少?
B开始作答,但是他要先问A:这个数是多少?
A说:是10
B给出了答案

下面来看代码:
主角有三:
1.接口CallBack类(回调方法)
2.A类(任务的发起者)
3.B类(任务的执行者)


1.首先是接口CallBack:

public interface CallBack {

    // 回调方法,本例的主角
    float doCallBack();

}

2.其次是任务发起者A类:

public class A implements CallBack {

    //A中的方法,参数是B类,该方法中调用B的方法
    public void AaskB(B class_b) {
        System.out.println("A开始问B问题: 某个数的10次方是多少?");
        //调用B的方法
        class_b.BanswerA(this);
    }

    //回调方法,这里抽出来写,也可以直接把上面的参数this改为直接new CallBack()直接写
    @Override
    public float doCallBack() {
        System.out.println("(A中的回调方法),A说,这个数是 2");
        return 2;
    }

}

3.最后是任务执行者B类:

public class B {

    // B中唯一的方法,被A调用了,这个方法的参数是A中的 回调函数
    public void BanswerA(CallBack callback) {

        System.out.println("B接收到A问的问题,但是B不知道这个数是什么,他调用A中的回调方法去问这个数");

        // 调用类A中的回调方法
        // 然后回答 
        // (这里两步并作一步写)
        System.out.println("B接收到A说的数,给出了答案" + Math.pow(callback.doCallBack(), 10));
    }

}

好了,大功告成:
让我们来写个测试类Test试试:

public class Test {

    public static void main(String[] args) {

        A classA = new A();
        B classB = new B();
        classA.AaskB(classB);

    }

}

控制台的输出结果:

A开始问B问题: 某个数的10次方是多少?
B接收到A问的问题,但是B不知道这个数是什么,他调用A中的回调方法去问这个数
(A中的回调方法),A说,这个数是 2
B接收到A说的数,给出了答案1024.0

如果还觉得不够直观。
那我们可以把他们稍作改造,全部简写在一个类中

//A类
public class A {

    //接口
    public interface CallBack {
        void doCallBack();
    }

    //A中的方法,调用B
    public void AaskB(B class_b) {
        class_b.BanswerA(new CallBack() {

            @Override
            public void doCallBack() {
                System.out.println("(A中的回调方法),A问B -- >B问A");
            }
        });
    }

    //B类,就一个方法(参数是接口)
    public static class B {
        public void BanswerA(CallBack callback) {
            callback.doCallBack();
        }
    }

    //测试类
    public static class Test {
        public static void main(String[] args) {
            A classA = new A();
            B classB = new B();
            classA.AaskB(classB);
        }
    }

}

执行,控制台输出:

(A中的回调方法),A问B -- >B问A

可以看到,虽然代码大量简写(省略了一些System.out),但是主要的核心思想,”回调”这个步骤还是展现出来了
测试中,A只是执行了问B的方法,控制台输出的 却是A类中的这个回调方法中的执行逻辑。

充分体现了,A问B,B问A,B再执行完毕。这个过程


好了,献上我的源码Demo源码

分成四个类写的: http://download.youkuaiyun.com/detail/lebang08/9649587
极简版: http://download.youkuaiyun.com/detail/lebang08/9649630

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值