在做第三方登录的时候涉及到了Java中的回调callback,于是仔细研究了一番,找了一个很形象的例子加Java代码,看完这个例子就理解回调啦!
一个很形象的例子:
BadBoy类坏孩子喜欢打人,有个方法叫hit,hit只能对实现了Hitable的对象执行。这时候,BadBoy已经做完了自己的事,也就是已经打完人了,然后挨打的人肯定知道是谁打了自己,至于挨打的人是什么反应,BadBoy是无法控制的。挨打的人有可能哭有可能跑有可能报警。,坏孩子在打了挨打者以后,把自己作为参数给了挨打者,等于是告诉挨打者,“我打了你,你爱怎么着怎么着吧”,接下来挨打者调用方法beHit,不同类型的挨打者会对坏孩子做出不同的反应。
BadBoy:
Java代码
1class BadBoy {
2 String name;
3
4 public BadBoy(String name) {
5 this.setName(name);
6 }
7
8 public String getName() {
9 return name;
10 }
11
12 public void setName(String name) {
13 this.name = name;
14 }
15 //打人
16 public void hit(Hitable hitable) {
17 System.out.println("----------------BEGIN----------------");
18 System.out.println("badboy " + this.getName() + "打了"
19 + hitable.getName() + "一拳");
20 hitable.beHit(this);
21 System.out.println("-----------------END----------------");
22 }
23
24 }
挨打的人的接口,他们有一个共同的方法,就是beHit(BadBoy boy),既然挨打了,肯定 知道是谁打的自己,所以打人者BadBoy被作为参数传进来。
Java代码
25interface Hitable {
26 public void beHit(BadBoy boy);
27
28 public String getName();
29
30 public void setName(String name);
31}
Child:这个类实现了Hitable,小孩挨打了,反应是哭。。
Java代码
32class Child implements Hitable {
33 String name;
34
35 public Child(String name) {
36 this.setName(name);
37 }
38
39 public String getName() {
40 return name;
41 }
42
43 public void setName(String name) {
44 this.name = name;
45 }
46
47 @Override
48 public void beHit(BadBoy boy) {
49 System.out.println("child " + this.getName() + "被" + boy.getName()
50 + "打哭了");
51 }
52
53}
BigMan也实现了Hitable接口,这类人比较猛,挨打后的反应,是把打人者杀了。。
Java代码
54class BigMan implements Hitable {
55 String name;
56
57 public BigMan(String name) {
58 this.setName(name);
59 }
60
61 public String getName() {
62 return name;
63 }
64
65 public void setName(String name) {
66 this.name = name;
67 }
68
69 @Override
70 public void beHit(BadBoy boy) {
71 System.out.println("bigman " + this.getName() + "把" + boy.getName()
72 + "杀死了");
73 }
74
75}
test类:
Java代码
76public class CallBackTest {
77 public static void main(String[] args) {
78 BadBoy badboy = new BadBoy("Tom");
79 Hitable child = new Child("Cat");
80 Hitable bigman = new BigMan("Boris");
81 badboy.hit(child);
82 badboy.hit(bigman);
83 }
84}
执行结果:
Java代码
85----------------BEGIN----------------
86badboy Tom打了Cat一拳
87child Cat被Tom打哭了
88-----------------END----------------
89----------------BEGIN----------------
90badboy Tom打了Boris一拳
91bigman Boris把Tom杀死了
92-----------------END----------------
总结:
类A中定义了一个方法hit,其参数是接口Hitable,类B和C都实现了接口Hitable,类A的对象在调用hit方法时,会根据其参数(类B或C的对象)的不同,在执行完该方法后,调用类B或C中的behit方法。