理解Java 回调

在做第三方登录的时候涉及到了Java中的回调callback,于是仔细研究了一番,找了一个很形象的例子加Java代码,看完这个例子就理解回调啦!

一个很形象的例子:
BadBoy类坏孩子喜欢打人,有个方法叫hit,hit只能对实现了Hitable的对象执行。这时候,BadBoy已经做完了自己的事,也就是已经打完人了,然后挨打的人肯定知道是谁打了自己,至于挨打的人是什么反应,BadBoy是无法控制的。挨打的人有可能哭有可能跑有可能报警。,坏孩子在打了挨打者以后,把自己作为参数给了挨打者,等于是告诉挨打者,“我打了你,你爱怎么着怎么着吧”,接下来挨打者调用方法beHit,不同类型的挨打者会对坏孩子做出不同的反应。
BadBoy:
Java代码 
1class BadBoy { 
2    String name; 

4    public BadBoy(String name) { 
5        this.setName(name); 
6    } 

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方法。

你可能感兴趣的:(java)