一, 简单的例子
小明通过自身的callHelp方法调用了小红(new SuperCalculator())的add方法,在调用的时候将自身的引用(this)当做参数一并传入,小红在使用计算器得出结果之后,回调了小明的fillBlank方法,将结果填在了黑板上的空格里。灯灯灯!到这里,回调功能就正式登场了,小明的fillBlank方法就是我们常说的回调函数。
通过这种方式,可以很明显的看出,对于完成老师的填空题这个任务上,小明已经不需要等待到加法做完且结果填写在黑板上才能去跟小伙伴们撒欢了,填空这个工作由超级计算器小红来做了。回调的优势已经开始体现了。
package com.example.callbacklearn;
public class Student {
private String name = null;
public Student(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public void callHelp(int a, int b) {
new SuperCalculator().add(a, b, this);
}
public void fillBlank(int a, int b, int result) {
System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result);
}
}
package com.example.callbacklearn;
public class SuperCalculator {
public void add(int a, int b, Student xiaoming) {
int result = a + b;
xiaoming.fillBlank(a, b, result);
}
}
package com.example.callbacklearn;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int a = 26549;
int b = 16487;
/**
* 小明通过自身的callHelp方法调用了小红(new SuperCalculator())的add方法,
* 在调用的时候将自身的引用(this)当做参数一并传入,小红在使用计算器得出结果之后,
* 回调了小明的fillBlank方法,将结果填在了黑板上的空格里。
*/
Student s = new Student("小明");
s.callHelp(a, b);
}
}
从上面可以看出 小明在调用 s.callHelp(a, b); 调用了 new SuperCalculator().add(a, b, this); 而在这个方法中又调用了小明的方法xiaoming.fillBlank(a, b, result); 这个就是回调了.
二, 这个回调中要传入this , 那么不是 student 该怎么办, 比如是个商贩 .
这种情况下,我们很自然的会想到继承和多态。如果让小明这个学生和老婆婆这个小商贩从一个父类进行继承,那么我们只需要给小红牌超级计算器传入一个父类的引用就可以啦。
不过,实际使用中,考虑到java的单继承,以及不希望把自身太多东西暴漏给别人,这里使用从接口继承的方式配合内部类来做。
换句话说,小红希望以后继续向班里的小朋友们提供计算服务,同时还能向老婆婆提供算账服务,甚至以后能够拓展其他人的业务,于是她向所有的顾客约定了一个办法,用于统一的处理,也就是自己需要的操作数和做完计算之后应该怎么做。这个统一的方法,小红做成了一个接口,提供给了大家,代码如下:
public interface DoJob {
public void fillBlank(int a, int b, int result);
}
因为灵感来自帮小明填空,因此小红保留了初心,把所有业务都当做填空(fillBlank)来做。
同时,小红修改了自己的计算器,使其可以同时处理不同的实现了doJob接口的人,代码如下:
package com.example.callbacklearn;
public class SuperCalculator {
public void add(int a, int b, DoJob customer) {
int result = a + b;
customer.fillBlank(a, b, result);
}
}
小明和老婆婆拿到这个接口之后,只要实现了这个接口,就相当于按照统一的模式告诉小红得到结果之后的处理办法,按照之前说的使用内部类来做,代码如下
package com.example.callbacklearn;
public class Student {
private String name = null;
public Student(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public class DoHomeWork implements DoJob{
@Override
public void fillBlank(int a, int b, int result) {
System.out.println(name + "求助小红计算:" + a + " + " + b + " = " + result);
}
}
public void callHelp(int a, int b) {
new SuperCalculator().add(a, b, new DoHomeWork());
}
}
商贩代码:
package com.example.callbacklearn;
public class Seller
{
private String name = null;
public Seller(String name)
{
// TODO Auto-generated constructor stub
this.name = name;
}
public void setName(String name)
{
this.name = name;
}
public class doHomeWork implements DoJob
{
@Override
public void fillBlank(int a, int b, int result)
{
// TODO Auto-generated method stub
System.out.println(name + "求助小红算账:" + a + " + " + b + " = " + result + "元");
}
}
public void callHelp (int a, int b)
{
new SuperCalculator().add(a, b, new doHomeWork());
}
}
计算代码:
package com.example.callbacklearn;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int a = 26549;
int b = 16487;
/**
* 小明通过自身的callHelp方法调用了小红(new SuperCalculator())的add方法,
* 在调用的时候将自身的引用(this)当做参数一并传入,小红在使用计算器得出结果之后,
* 回调了小明的fillBlank方法,将结果填在了黑板上的空格里。
*/
Student s = new Student("小明");
s.callHelp(a, b);
int c = 26497;
int d = 11256;
Seller s2 = new Seller("老婆婆");
s2.callHelp(c, d);
}
}
在调别人的过程中, 别人回过来调你的方法