java中回调函数的理解
一,案例一
“通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写,等待别人(张三)调用的函数,在C语言中,回调函数通常通过函数指针来传递;在Java中,通常就是编写另外一个类或类库的人(李四)规定一个接口,然后你(张三)来实现这个接口,然后把这个实现类的一个对象作为参数传给别人的程序,别人的程序必要时就会通过那个接口来调用你编写的函数。”
使用技巧:定一个接口,在接口中声明我们想调用的方法。
在另一个方法中注册刚定义的回调接口
第一步:定义回调接口
package com.callback;
/**
* @since 2012-02-02
* @desc 定义回调接口
*/
public interface CallBackInterface {
public void doSome();
public void exectueMethod();
}
第二步:李四编写的程序
package com.callback;
/**
* @since 2012-02-02
* @desc 李四
*/
public class MethodB {
public double getTime(CallBackInterface callBack) {
long start = System.currentTimeMillis();
callBack.exectueMethod();
long end = System.currentTimeMillis();
System.out.println("cost time=" + (end - start));
return end - start;
}
}
第三步:张三实现李四规定的接口
package com.callback;
/**
* @since 2012-02-02
* @desc 张三
*/
public class MethodA {
public static void main(String args[]){
MethodB b=new MethodB();
//返回值d只和MethodB有关,和接口中方法的返回值无关
double d=b.getTime(new CallBackInterface() {
//张三实现了李四定义的接口
public void exectueMethod() {
new MethodA().testMethod();
}
@Override
public void doSome() {
}
});
System.out.println("d="+d);
}
public void testMethod(){
for(int i=0;i<10000;i++){
System.out.print("");
}
}
}
输出结果:
cost time=31
d=31.0
下面举个通俗的例子:
某天,我打电话向你请教问题,当然是个难题,:),你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号码必须在以前告诉你,这便是注册回调函数;我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
通过上面个人感觉到回调函数更多的应用就是结合异步。比如:ajax中jServer通过组件和服务器的异步通信。
二,案例二
public interface MyInterface {
void sayYourName();
}
public class MyClass {
public MyClass() {
Log.e("WangJ", "MyClass-constructor"); //标注构造函数
}
/* 用接口类型的对象作为输入参数 */
public void sayYourName(MyInterface myInterface){
Log.e("WangJ", "MyClass-sayYourName_start"); //标注方法开始
myInterface.sayYourName(); //遇到不知道具体实现的时候就用接口的抽象方法
Log.e("WangJ", "MyClass-sayYourName_finish"); //方法结束
}
}
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyClass myClass = new MyClass();
myClass.sayYourName(new MyInterface() { //实现接口并作为参数传入
@Override
public void sayYourName() {
Log.e("WangJ", "callBack-interface-implementor"); //具体操作实现
}
});
}
}
三,自己的理解
java中所谓的回调函数就是,张三已经定义好了一个方法,这个方法有自己的逻辑,只不过现在还不知给谁用而已。有一天,李四突然发现要用这个方法了,只要实现他写的这个方法的接口就可以了。
例如上面的案例一种的定义了一个程序花费时间的案例,在开始时间和结束时间中间有一行执行的代码,这行代码就是接口的抽象的方法,而调用者也就是李四只要去回调这个方法就可以了,就可以计算出他的代码所花费的时间了。
在比如说案例二的代码,在start 和finish中间定义了一个接口的方法,这时候后面的调用者只要去实现这个方法就可以了,就会把自己的逻辑加上去。
总而言之,java回调就是把自己的逻辑加到已经实现的方法中去。
java中回调函数的理解的更多相关文章
- 对于Python中回调函数的理解
关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...
- java中回调函数的使用
package com.huawei.common; import java.sql.ResultSet;import java.sql.SQLException; /** * 回调函数 * @aut ...
- Java中回调函数编写
package XXX.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStr ...
- 回调函数透彻理解Java
http://blog.csdn.net/allen_zhao_2012/article/details/8056665 回调函数透彻理解Java 标签: classjavastringinterfa ...
- js中的回调函数的理解和使用方法
js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...
- js中的回调函数的理解
一,常见的但是不是特别注意的回调方法. 1.1,ajax $.ajax({ url:"test.json", type: "GET", data: {usern ...
- C++中回调函数(CallBack)的使用
如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而 ...
- js回调函数(callback)理解
Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...
- 关于C++与Java中虚函数问题的读书笔记
之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的 ...
随机推荐
- BZOJ 2733: [HNOI2012]永无乡 [splay启发式合并]
2733: [HNOI2012]永无乡 题意:加边,询问一个连通块中k小值 终于写了一下splay启发式合并 本题直接splay上一个节点对应图上一个点就可以了 并查集维护连通性 合并的时候,把siz ...
- BZOJ 1426: 收集邮票 [DP 期望 平方]
传送门 题意: 有n种不同的邮票,皮皮想收集所有种类的邮票.唯一的收集方法是到同学凡凡那里购买,每次只能买一张,并且买到的邮票究竟是n种邮票中的哪一种是等概率的,概率均为1/n.但是由于凡凡也很喜欢邮 ...
- Codevs 3990 [中国剩余定理]
模板题 注意如何得到[a,b]区间范围内的解 #include <iostream> #include <cstdio> #include <cstring> #i ...
- bind,apply,call区别总结
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- ettercap+urlsnarf+driftnet+wireshark监听妹子上网
搞事肯定得确认目标.所以我们得先确认一个目标 确认目标这种事情不多说. 1.开启IP转发 echo 1 > /proc/sys/net/ipv4/ip_forward 然后ettercap ...
- thinkPHP数据库操作
thinkPHP如果要对数据库操作,一般来说首先要做的是在配置文件中链接数据库,然后用M方法实例化一张表,然后就是对表的操作了 可以开启调试功能查看程序执行的sql语句: 1.开启调试功能(默认是已经 ...
- 阿里云CentOS使用iptables禁止某IP访问
在CentOS下封停IP,有封杀网段和封杀单个IP两种形式.一般来说,现在的攻击者不会使用一个网段的IP来攻击(太招摇了),IP一般都是散列的.于是下面就详细说明一下封杀单个IP的命令,和解封单个IP ...
- 8、flask之flask-script组件
Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的脚本,cronjobs,及其他运行在web应用之外的命令行任 ...
- C++ 函数模板“偏特化”
模板是C++中很重要的一个特性,利用模板可以编写出类型无关的通用代码,极大的减少了代码量,提升工作效率.C++中包含类模板.函数模板,对于需要特殊处理的类型,可以通过特化的方式来实现特定类型 ...
- kvm命令总结和虚机器备份迁移
管理kvm虚拟机命令 virsh uri: 查看当前主机上hypervisor的连接路径: virsh connect ...