回顾接口回调:Interface CallBack 两种简单小思维

本文通过一个生动的例子介绍了Java中接口回调的两种实现方式:一种是将接口定义独立出来,另一种是在类内部定义接口。这两种方式均实现了小王询问小李问题后继续做其他事情,而小李计算出答案后通过回调通知小王。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天又有一位高中同学,也可以算是刚接触Java的朋友问我一些问题,然后问到了接口回调,我就和他说明了,顺便有点时间,随手写了出来,希望简单的小案例能帮助到有需要的大家。

问题描述:

  • 1.小王问小李问题;
  • 2.小李一时回答不出来,需要计算
  • 3.小王因为急着玩,问完就走了。
  • 4.小李得出答案后就给小王答案。
写法1- 接口单独写:
  • 1.接口 :CallBack.java
//接口,誰設置誰/直接调用(选择在哪执行)谁給出結果,誰實現誰得到結果。
public interface CallBack {
    public void solve(String result);
}
  • 2.Wang.java
//王得到答案
public class Wang implements CallBack {
    Li li;

    public Wang(Li li) {
        this.li = li;
    }

    public void askQuestion(final int num) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                li.executeMessage(Wang.this, num);
            }
        }).start();
        //问完不管得到答案与否,马上玩耍去了
        goPlay();
    }

    private void goPlay() {
        System.out.println("问完问题,答案未知,玩去了...");
    }

    @Override
    public void solve(String result) {
        System.out.println("得到了答案 : " + result);
    }
}
  • 3.Li.java
public class Li {

    public void executeMessage(CallBack callBack, int num) {
        System.out.println("小王的问题是: "+num);

        //模拟办事
        int count = 0;
        for (int i = 0; i < num; i++) {
            if (i > 0 && i % 2 == 0) {
                count++;
            }
        }

        String reslut = "答案是"+count;

        //得到答案,告诉小王
        callBack.solve(reslut);
    }
}
  • Test.java
public class Test {
    public static void main(String[] args) {
        Wang wang = new Wang(new Li());
        wang.askQuestion(1000);
    }
}

打印结果:

问完问题,答案未知,玩去了...
小王的问题是: 1000
得到了答案 : 答案是499

写法2-接口写在类中:
  • Wang.java
//王得到答案
public class Wang implements CallBack {
    Li li;

    public Wang(Li li) {
        this.li = li;
    }

    public void askQuestion(final int num) {
        //异步
        new Thread(new Runnable() {
            @Override
            public void run() {
            //先设回调,再到执行信息方法。
                li.setCallBack(new Li.CallBack() {
                    @Override
                    public void solve(String result) {
                        System.out.println("得到了答案 : " + result);
                    }
                });
                //才再到执行方法。
                li.executeMessage(num);
            }
        }).start();
    //问完就玩耍,异步
        goPlay();
    }

    private void goPlay() {
        System.out.println("问完问题,答案未知,玩去了...");
    }
  • Li.java
public class Li {

    //public void executeMessage(CallBack callBack, int num),写在内部了,不用传过来。
    public void executeMessage(int num) {
        System.out.println("小王的要求数字是: " + num);

        //模拟办事
        int count = 0;
        for (int i = 0; i < num; i++) {
            if (i > 0 && i % 2 == 0) {
                count++;
            }
        }

        String reslut = "答案是" + count;

        //接口方法在此执行:得到答案,告诉小王
        callBack.solve(reslut);
    }
    //接口在内部写
    public interface CallBack {
        void solve(String result);
    }

    private CallBack callBack;

    public void setCallBack(CallBack callBack) {
        this.callBack = callBack;
    }
}
  • Test.java
public class Test {
    public static void main(String[] args) {
        Wang wang = new Wang(new Li());
        wang.askQuestion(1000);
    }
}

输出结果:

问完问题,答案未知,玩去了...
小王的要求数字是: 1000
得到了答案 : 答案是499
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值