今天又有一位高中同学,也可以算是刚接触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