一,案例一

“通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写等待别人(张三)调用的函数,在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中回调函数的理解的更多相关文章

  1. 对于Python中回调函数的理解

    关于回调函数,网上有很多说明和各种解释,多数在尝试用语言描述.我认为,如果对各个角色之间的关系不清楚,如果没有相关的编程需求,那么语言便非常无力,很难理解. 这是360百科的解释: 在计算机程序设计中 ...

  2. java中回调函数的使用

    package com.huawei.common; import java.sql.ResultSet;import java.sql.SQLException; /** * 回调函数 * @aut ...

  3. Java中回调函数编写

    package XXX.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStr ...

  4. 回调函数透彻理解Java

    http://blog.csdn.net/allen_zhao_2012/article/details/8056665 回调函数透彻理解Java 标签: classjavastringinterfa ...

  5. js中的回调函数的理解和使用方法

    js中的回调函数的理解和使用方法 一. 回调函数的作用 js代码会至上而下一条线执行下去,但是有时候我们需要等到一个操作结束之后再进行下一个操作,这时候就需要用到回调函数. 二. 回调函数的解释 因为 ...

  6. js中的回调函数的理解

    一,常见的但是不是特别注意的回调方法. 1.1,ajax $.ajax({ url:"test.json", type: "GET", data: {usern ...

  7. C++中回调函数(CallBack)的使用

    如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过. 其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而 ...

  8. js回调函数(callback)理解

    Mark! js学习 不喜欢js,但是喜欢jquery,不解释. 自学jquery的时候,看到一英文词(Callback),顿时背部隐隐冒冷汗.迅速google之,发现原来中文翻译成回调.也就是回调函 ...

  9. 关于C++与Java中虚函数问题的读书笔记

    之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的 ...

随机推荐

  1. BZOJ 2388: 旅行规划 [分块 凸包 等差数列]

    传送门 题意: 区间加和询问一段区间内整体前缀和的最大值 刚才还在想做完这道题做一道区间加等差数列结果发现这道就是.... 唯一的不同在于前缀和一段区间加上等差数列后,区间后面也要加上一个常数!!! ...

  2. adb模拟操作之event

    首语: 我们都知道,adb可以对模拟器和root过的真机进行很多操作,例如:模拟点击,输入,截图,手机和PC,数据互传等.这篇要说的就是adb操作模拟器或者真机的输入输出. 0x01 问题 使用adb ...

  3. [代码]JAVA触发器,Spring的quartz配置

    Spring的quartz中的配置代码,spring-quartz.xml: <?xml version="1.0" encoding="UTF-8"?& ...

  4. c语言环境初始化&c语言和汇编混合编程

    bootloader通常会分为两个阶段:第一阶段采用汇编语言来编写,主要是一些核心的初始化工作(内存,时钟的初始化),第二阶段使用C语言来编写,主要是它会完成一些板载硬件的初始化(串口,网口)然后其启 ...

  5. Java常用日志框架介绍

    Java常用日志框架介绍 java日志概述 对于一个应用程序来说日志记录是必不可少的一部分.线上问题追踪,基于日志的业务逻辑统计分析等都离不日志.java领域存在多种日志框架,目前常用的日志框架包括L ...

  6. springmvc+mybatis+mysql 数据库插入中文是乱码

    java web项目,前台页面的表单数据,插入到数据库时,结果出现乱码"???"的问题,断断续续折腾了一天时间,废话不说,步骤如下: 一:在web.xml中配置:编码格式拦截器 & ...

  7. ActiveMQ、Stomp、SockJS入门级应用

    使用ActiveMQ.Stomp.SockJS实现实时在线聊天 ActiveMQ : 强大的开源即时通讯和集成模式的服务器.在本项目中充当消息代理服务器,stomp协议服务端. 安装:在官网下载,直接 ...

  8. 来了解一下Mysql索引的相关知识:基础概念、性能影响、索引类型、创建原则、注意事项

    索引的基础概念索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录,定位对应的页码:存储引擎使用类似的方式进行数据查询,先去索引当中找到对应的值,然后根据匹配的索引找到对应的数据行 ...

  9. Nginx和php是怎么通信的?

    先来看一下搭建好PHP运行环境的Nginx配置文件. 非常重要的就是 fastcgi_pass 指令了,这个指令用于指定 fpm 进程监听的地址,Nginx 会把所有的 php 请求翻译成 fastc ...

  10. UVA - 1218 Perfect Service (树形DP)

    思路:dp[i][0]表示i是服务器:dp[i][1]表示i不是服务器,但它的父节点是服务器:dp[i][2]表示i和他的父亲都不是服务器.       转移方程: d[u][0] += min(d[ ...