利用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 条评论
登录 后参与评论

相关文章

来自专栏大数据钻研

总结一些前端的知识点 (一)

一、W3C 标准盒模型和 IE 盒模型区别: 1. W3C 标准盒模型: ? 盒子的高宽是由盒子的内容区仅由 width, height 决定的,不包含边框,内...

3247
来自专栏Java编程

Java正则表达式详解

Java 提供了功能强大的正则表达式API,在java.util.regex 包下。本教程介绍如何使用正则表达式API。

6960
来自专栏Python小屋

Python字符串index()方法应用案例一则

553
来自专栏前端小吉米

JS 完美的 AOP 编程

1254
来自专栏Java3y

Javascript面向对象入门

什么是JavaScript? 我们可以从几个方面去说JavaScript是什么: 基于对象 javaScript中内置了许多对象供我们使用【String、Dat...

3016
来自专栏CSDN技术头条

常用 XML 解析技术

现在的软件项目都不是独立的一个项目,都是多系统协调工作。这样的话就涉及到系统间的通讯,通讯就会跟报文传输挂上关系。系统间使用怎样的报文格式进行通讯呢?有的使用固...

703
来自专栏个人随笔

析构函数(C#)

 析构函数又称终结器,用于析构类的实例。 定义   析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系...

3097
来自专栏Golang语言社区

go(golang)中的类型转换

在使用 go 这样的强类型语言时,我们常常会遇到类型转换的问题。比如 int 类型转 int64,interface{} 转 struct ,对一种类型取指针、...

47210
来自专栏问天丶天问

Java 8 特性

1453
来自专栏Pythonista

前端学习之JavaScript

尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分。实际上,一个完整的 JavaScri...

1043

扫码关注云+社区