利用java的接口实现回调

onclick,onfocus,onload,oncreate...... 我们在java GUI 编程、js事件、android组建中常常见到这些单词,这些函数就是回调函数。C语言利用指针实现回调,与面向对象的语言不同。我们这里介绍利用java的接口实现回调的方法。

回调是一种双向的调用模式,例如我们要调用B的一个特定的方法,B在执行完又要调用A的一个方法,而这个A(或者说A的这个方法)是由我们自己实现的。所以可以这样理解:“回调函数也是一个函数或过程,不过它是一个由调用方自己实现,供被调用方使用的特殊函数。”

不过,有了面向对象的机制后,我们就可以轻松地使用这套机制来实现回调了,让回调变得简单。

例子:

package com.yawn.callback;

/**
 * 回调要达到的效果就是在执行完b的go方法之后,再自动调用我们自己实现的onFinish方法
 * A可以是任何一个实现了Finish接口的类,用于存放我们实现的onFinish方法
 * 
 * @author yawn
 *
 */
public class CallBack {
	public static void main(String[] args) {
		B b = new B(new A()); // 初始化B并指定B所要回调的对象(方法)
		b.go();
	}
}

class A implements Finish{
	@Override
	public void onFinish() {
		System.out.println("finish");
	}
}
package com.yawn.callback;

/**
 * B的内部实现也很简单,只需要一个接口类型的成员变量(这个成员变量的具体实现由我们初始化B时指定),
 * 在执行方法完成时调用这个成员变量(接口对象)的onFinish方法即可
 * 
 * @author yawn
 *
 */
public class B {
	Finish f ;
	public B(Finish f){
		this.f = f;
	}
	void go(){
		System.out.println("Go go go!");
		if (f != null){
			f.onFinish();
		}
	}
}
package com.yawn.callback;

public interface Finish {
	void onFinish();
}

这样就可以在调用B的go方法之后又调用我们实现的onFinish方法了。

运行结果
Go go go!
finish

其实在初始化B时不一定要实现一个类A,也可以直接实现接口中的方法:

package com.yawn.callback;

/**
 * 回调要达到的效果就是在执行完b的go方法之后,再自动调用我们自己实现的onClick方法
 * A可以是任何一个实现了Finish接口的类,用于存放我们实现的onFinish方法
 * 
 * @author yawn
 *
 */
public class CallBack {
	public static void main(String[] args) {
		B b = new B(new Finish() {
			@Override
			public void onFinish() {
				System.out.println("finish");
			}
		});
		b.go();
	}
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏达摩兵的技术空间

js代码规范

20. 判断是否相等时候 采用=== 判断包括类型的相等 21. 尽量使用语法严格模式 消除代码之中的不友好;代码运行更快 ;保证运行的安全 ;为新版本的...

603
来自专栏前端知识分享

第79天:jQuery事件总结(二)

       上一篇讲到jQuery中的事件,深入学习了加载DOM和事件绑定的相关知识,这篇主要深入讨论jQuery事件中的合成事件、事件冒泡和事件移除等内容。

652
来自专栏十月梦想

函数

                                            函数体

653
来自专栏程序员互动联盟

【专业知识】初学者需要知道的10个Java字符串问题

下面我为大家总结了10条Java开发者经常会提的关于Java字符串的问题,如果你也是Java初学者,仔细看看吧: ? 1、如何比较字符串,应该用”==”还是eq...

3497
来自专栏开心的学习之路

JavaScript概览

近日的项目需要用JavaScript完成,于是决定通读《JavaScript高级程序设计第三版》,书是2012年的,比较老了,但是可以用来快速了解JavaScr...

2824
来自专栏老九学堂

必看 | 新人必看的Java基础知识点大梳理

各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的“冰镇西瓜,”给大家清凉一下,压压惊。但这个大西瓜可不是一般的大西瓜,是...

3408
来自专栏深度学习计算机视觉

java正则表达式详解

正则表达式用于指定字符串的模式,你可以任何需要定位使用匹配某种特定模式的字符串的情况下使用正则表达式 jdk1.4推出java.util.regex包,就为我们...

2474
来自专栏达摩兵的技术空间

与我一起学正则

1、校验密码强度 密码的强度必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间 ^(?=.\d)(?=.[a-z])(?=.*[A-Z])...

603
来自专栏前端小叙

事件绑定的几种常见方式

在项目开发中,经常遇到绑定事件不起作用,或者事件绑定多次,导致重复触发。 1.事件绑定的几种常见方式(以click事件为例) jquery: $(select...

3278
来自专栏C/C++基础

C/C++文字常量与常变量

在C/C++编程时,经常遇到以下几个概念:常量、文字常量、字面常量、符号常量、字符常量、常变量、字符串常量等,网上的资料描述的不尽相同,弄得大家云里雾里。本文将...

1072

扫描关注云+社区