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

相关文章

来自专栏余生开发

echarts太阳分布图-饼图来回穿梭

var dom = document.getElementById("container");

1202
来自专栏增长技术

App Guide相关

##TourGuide https://github.com/worker8/TourGuide

702
来自专栏码匠的流水账

java9系列(五)Stack-Walking API

java9新增这个类的目的是提供一个标准API用于访问当前线程栈,之前只有Throwable::getStackTrace、Thread::getStackTr...

421
来自专栏搞前端的李蚊子

Html5模拟通讯录人员排序(sen.js)

// JavaScript Document  var PY_Json_Str = ""; var PY_Str_1 = ""; var PY_Str_...

5916
来自专栏专知

2018年SCI期刊最新影响因子排行,最高244,人工智能TPAMI9.455

2018年6月26日,最新的SCI影响因子正式发布,涵盖1万2千篇期刊。CA-Cancer J Clin 依然拔得头筹,其影响因子今年再创新高,达244.585...

1282
来自专栏一个会写诗的程序员的博客

java.base.jmod

/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/jmods$ jmod list java....

1112
来自专栏草根专栏

适合在Markdown里面使用的emoji

因为Markdown里面加颜色需要写html style, 所以对于一些标题, 还是用一下emoji吧: RED APPLE (🍎): ? GR...

2714
来自专栏前端儿

Web 前端颜色值--字体--使用,整理整理

颜色值 CSS 颜色使用组合了红绿蓝颜色值 (RGB) 的十六进制 (hex) 表示法进行定义。对光源进行设置的最低值可以是 0(十六进制 00)。最高值是 2...

2322
来自专栏Golang语言社区

Knapsack problem algorithms for my real-life carry-on knapsack

I'm a nomad and live out of one carry-on bag. This means that the total weight o...

1142
来自专栏Pulsar-V

Save Camera Document

#pragma once #include "HCCamera.h" #include <time.h> #include <cstdio> #incl...

2828

扫码关注云+社区