浅谈对回调函数的理解
2015-08-06 21:00
253 查看
回调函数的个人理解:你使用别人的类的方法,但是别人的函数却要调用你的代码。
其实回调函数并没有想象中的那么神秘。举个例子:别人已经写好的类的方法需要调用你实现的代码,该怎么调?
答:别人在设计的时候就只需要给你一个接口,你在使用别人的代码的时候,只需要将固定接口的子类对象 传给那份代码,就可以完成功能。
当那份代码执行的时候,去调用那个接口的方法,实际执行的是你提供的对象的方法(面向接口编程,接口指向子类对象),那么就可以调用到你的代码啦。
为了增强理解,给个简单的代码,先运行再观察:
package com.shusheng.Mytest;
/**
* 这个类是别人已经写好的类,提供给我们使用
* 别人想调用我的方法体,必须给我一个接口。
* 打个不且当的比方:乞丐想要过路人的钱,那么他必须先给一个碗。(理解不了就忽略)
* @author Administrator
*
*/
public class OthersClass {
//别人写好的类需要用到我的方法体。就给我一个Callback接口,让我实现里面的方法。然后我使用这个类的时候就将该接口的一个实例对象传进去。
public void Say(Callback callback) {
//设计的时候并不知道这个execute()方法体的内容。
callback.execute();
}
}
package com.shusheng.Mytest;
/**
* 这个是别人提供给用户的一个接口,用户只需要实现该接口,将这个接口对象传进去,就可以使用别人的say()方法。
* @author Administrator
*
*/
public interface Callback {
public void execute();
}
package com.shusheng.Mytest;
/**
* 这个是我自己的类,我想使用OtherClass 的say方法,那么我必须传进去一个接口对应的对象,然后就可以使用那个say方法(居然别人写好的类可以调用我写的代码。简称回调)
* @author Administrator
*
*/
public class MyClass {
public static void main(String[] args) {
//我要使用别人的say方法。Say(callback),所以我要先实例化一个Callback的子类,然后将该对象传进say方法里面(注意别人提供的say是业务方法,execute()是需要你去填充的方法,say方法体调用execute方法)
//构造一个子类,当然这个类可以在外面写,这里只是方便大家理解(内部类,和外部类都很少用)
class MyCallback implements Callback {
@Override
public void execute() {
System.out.println("这个是我的方法体,但是方法签名是别人提供的,我所在的类在其他类里面,所以我叫内部类,但我不是匿名类,因为类名叫MyCallback,");
}
}
//new一个对象,准备将myCallback对象传进say方法
MyCallback myCallback = new MyCallback();
OthersClass others = new OthersClass();
others.Say(myCallback);
}
/*--------------------上面的main方法的形式很少用,请使用下面的方法-----------------------*/
//下面使用匿名内部类,(很常用,因为代码很简练)。匿名内部类,跟上面实质是一样的。需要使用别人提供的Say(callback)方法,同样要传入一个Callback对象,
//但是一个对象可以不要名称,(上面的对象名叫myCallback),可以只需要一个方法体。于是只需要new一个接口,然后将需要实现的方法实现了就是(匿名内部类)了。
/* public static void main(String[] args) {
OthersClass others = new OthersClass();
others.Say(new Callback() {
@Override
public void execute() {
System.out.println("这个方法体是我自己写的,方法名是别人固定的。我所在的类在其他类里面,所以是内部类。我所在的类又没有名称,所以我是匿名的,请叫我所在类为 匿名内部类");
}
});
}*/
}
其实回调函数并没有想象中的那么神秘。举个例子:别人已经写好的类的方法需要调用你实现的代码,该怎么调?
答:别人在设计的时候就只需要给你一个接口,你在使用别人的代码的时候,只需要将固定接口的子类对象 传给那份代码,就可以完成功能。
当那份代码执行的时候,去调用那个接口的方法,实际执行的是你提供的对象的方法(面向接口编程,接口指向子类对象),那么就可以调用到你的代码啦。
为了增强理解,给个简单的代码,先运行再观察:
package com.shusheng.Mytest;
/**
* 这个类是别人已经写好的类,提供给我们使用
* 别人想调用我的方法体,必须给我一个接口。
* 打个不且当的比方:乞丐想要过路人的钱,那么他必须先给一个碗。(理解不了就忽略)
* @author Administrator
*
*/
public class OthersClass {
//别人写好的类需要用到我的方法体。就给我一个Callback接口,让我实现里面的方法。然后我使用这个类的时候就将该接口的一个实例对象传进去。
public void Say(Callback callback) {
//设计的时候并不知道这个execute()方法体的内容。
callback.execute();
}
}
package com.shusheng.Mytest;
/**
* 这个是别人提供给用户的一个接口,用户只需要实现该接口,将这个接口对象传进去,就可以使用别人的say()方法。
* @author Administrator
*
*/
public interface Callback {
public void execute();
}
package com.shusheng.Mytest;
/**
* 这个是我自己的类,我想使用OtherClass 的say方法,那么我必须传进去一个接口对应的对象,然后就可以使用那个say方法(居然别人写好的类可以调用我写的代码。简称回调)
* @author Administrator
*
*/
public class MyClass {
public static void main(String[] args) {
//我要使用别人的say方法。Say(callback),所以我要先实例化一个Callback的子类,然后将该对象传进say方法里面(注意别人提供的say是业务方法,execute()是需要你去填充的方法,say方法体调用execute方法)
//构造一个子类,当然这个类可以在外面写,这里只是方便大家理解(内部类,和外部类都很少用)
class MyCallback implements Callback {
@Override
public void execute() {
System.out.println("这个是我的方法体,但是方法签名是别人提供的,我所在的类在其他类里面,所以我叫内部类,但我不是匿名类,因为类名叫MyCallback,");
}
}
//new一个对象,准备将myCallback对象传进say方法
MyCallback myCallback = new MyCallback();
OthersClass others = new OthersClass();
others.Say(myCallback);
}
/*--------------------上面的main方法的形式很少用,请使用下面的方法-----------------------*/
//下面使用匿名内部类,(很常用,因为代码很简练)。匿名内部类,跟上面实质是一样的。需要使用别人提供的Say(callback)方法,同样要传入一个Callback对象,
//但是一个对象可以不要名称,(上面的对象名叫myCallback),可以只需要一个方法体。于是只需要new一个接口,然后将需要实现的方法实现了就是(匿名内部类)了。
/* public static void main(String[] args) {
OthersClass others = new OthersClass();
others.Say(new Callback() {
@Override
public void execute() {
System.out.println("这个方法体是我自己写的,方法名是别人固定的。我所在的类在其他类里面,所以是内部类。我所在的类又没有名称,所以我是匿名的,请叫我所在类为 匿名内部类");
}
});
}*/
}
相关文章推荐
- 图结构练习——最小生成树 Kruskal算法
- 九度OJ 题目1032:ZOJ
- 该离开了吗?
- 连续特征离散化的好处
- 读《数学之美》第三章 统计语言模型
- uwsgi 和 flask的使用
- Leetcode(58)题解:Length of Last Word
- 网页制作实践步骤四 结束
- java和javac编译运行java程序
- ios越狱开发随感
- opencv 读写XML YML
- Material Design设计规范
- 使用TFHpple第三方库解析html简介
- Linux的常用用法
- opencv 读写XML YML
- C语句
- 实战MVC
- java设计模式(7) - 代理模式
- mysql登录报错ERROR 1045 (28000) 的解决方法
- 工作中遇到的问题-1