Java回调函数
2020-04-25 13:22:47
本文总阅读量

回调函数的定义

回调函数在百度百科中的定义为:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

解释:回调函数就是一个通过函数指针调用的函数

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>

using namespace std;

int max(int a, int b) {
return a > b ? a : b;
}

int main() {
int (*p)(int, int) = &max; // 定义一个函数指针p,这个函数有两个int类型的参数,返回值为int
cout << p(1, 2) << endl; // 通过函数指针p调用函数max
return 0;
}

解释:如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>

using namespace std;

void fun2(void (*p)()) {
p();
}

void fun1() {
cout << "函数fun1被调用" << endl;
}

int main() {
void (*p)() = &fun1;
fun2(p); // 将函数fun1的地址作为参数传到fun2中,再用这个指针调用fun1。
return 0;
}

Java回调函数

在Java中回调函数的意思就是:类A调用类B中的b方法,执行完b方法之后又反过来调用A中的a方法。

用一个通俗的例子解释就是:假设你公司的总经理给你布置了一个任务,只有你完成这个任务以后,总经理才能继续做他的工作。

这里的总经理就是类A,我就是类B,我要完成的任务就是方法b,而总经理的工作就是方法a。

代码

主类
1
2
3
4
5
6
public class Main {
public static void main(String[] args) {
Personnel personnel = new Personnel();
new Manager(personnel, "整理文件");
}
}
总经理类
1
2
3
4
5
6
7
8
public class Manager {
public Manager(Personnel personnel, String task) {
personnel.doSomething(this, task);
}
public void doSomething() {
System.out.println("总经理要做到事情。");
}
}
员工类
1
2
3
4
5
6
7
public class Personnel {
public void doSomething(Manager manager, String task) {
System.out.println("总经理安排了" + task + "的任务。");
System.out.println("完成任务中……\n任务完成!");
manager.doSomething();
}
}

抽象为一个接口

现实工作中不止总经理给我们安排任务,还有副经理,主管等等,所以可以将回调方法抽象成一个接口。

主类
1
2
3
4
5
6
7
8
9
package CallbackFunctionsDemo;

public class Main {
public static void main(String[] args) {
Personnel personnel = new Personnel();
new Manager(personnel, "整理文件");
new DeputyManager(personnel, "制作PPT");
}
}
回调方法抽象成接口
1
2
3
4
5
6
package CallbackFunctionsDemo;

public interface Superior {
void doSomething();
String getPosition();
}
总经理类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package CallbackFunctionsDemo;

public class Manager implements Superior{

public Manager(Personnel personnel, String task) {
personnel.doSomething(this, task);
}

@Override
public void doSomething() {
System.out.println("总经理要做到事情。");
}

@Override
public String getPosition() {
return "总经理";
}

}
副经理类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package CallbackFunctionsDemo;

public class DeputyManager implements Superior{

public DeputyManager(Personnel personnel, String task) {
personnel.doSomething(this, task);
}

@Override
public void doSomething() {
System.out.println("副经理要做到事情。");
}

@Override
public String getPosition() {
return "副经理";
}
}
员工类
1
2
3
4
5
6
7
8
9
10
11
package CallbackFunctionsDemo;

public class Personnel {

public void doSomething(Superior superior, String task) {
System.out.println(superior.getPosition() + "安排了" + task + "的任务。");
System.out.println("完成任务中……\n任务完成!");
superior.doSomething();
}

}

运行结果

参考

https://blog.csdn.net/jiayi_yao/article/details/51046526