再谈java回调函数
作者:hebedich 发布时间:2023-09-27 19:20:10
又遇到了回调函数,这次打算写下来分享一下。
所谓回调函数,或者在面向对象语言里叫回调方法,简单点讲,就是回头在某个时间(事件发生)被调用的函数。
再详细点:就是一个函数A,作为参数,传入了另一个函数B,然后被B在某个时间调用。
这里可以有疑问了,既然是一个函数调用另一个函数,可以在函数体里面调用啊,为什么还要把函数作为参数传到另一个函数里被调用?何况还有一些语言(比如java)不支持把函数作为参数。
对的,确实可以在函数体里调用另一个函数,功能上好像是没差别的,但是这里有一个问题,就是你要调用的这个函数被写死了,也就是说这样函数B只能调用函数A了,这样如果在另一个情景下,有个与A不同实现的函数C也需要在B的某个时刻被调用,那怎么办。
下面继续说回调函数,在c/c++里,回调函数可以使用函数指针作为参数被另一个函数调用;在c#里,可以使用委托,如果是事件方法的话,还有event关键字;在python和javascript里,可以直接把函数当对象传参,这些语言都很好实现回调函数(方法),可是, java呢? 先说点题外话,自从学了C#,就不喜欢java了,曾经一度打算以后不再用java,可是现实并没有那么理想,我现在要做android,所以还是不能放下java,而且今天遇到这个回调函数的问题,也是从java里遇到的,我个人觉得,在这个博客里出现的语言,除了java外,对于回调,都可以既容易,又好理解的实现,但是java,我觉得并不是那样,不然我也不会来写这篇博客。
好了继续说,关于java中的回调方法的实现。这篇博客的重点就是说java的。 在java中,回调方法是用借用接口来实现的,我在网上找到一句话:
“把实现某一接口的类所创建的对象的引用,赋值给该接口声明的接口变量,那么该接口变量就可以调用被实现的接口的方法”。
很绕哈,简单解释下:
有一个接口,接口里有一个方法(这个方法就是要回调的方法):
interface CallBackInterface {
void callBackMethod();
}
我们知道,接口对象不能直接用,因为里面的方法都没有实现。所以要找个类实现这个接口。
所以现在加一个类,实现这个接口:
interface CallBackInterface {
void callBackMethod();
}
class CallBackClass implements CallBackInterface{
@Override
public void callBackMethod() {
System.out.println("hello");
}
}
好了,最后一步:把实现了接口的类的对象赋值给声明的接口变量(我给写进一个方法里了,然后外面加了个类的壳子):
public class CallBackTest {
interface CallBackInterface {
void callBackMethod();
}
class CallBackClass implements CallBackInterface {
@Override
public void callBackMethod() {
System.out.println("hello");
}
}
public void showCallBack() {
CallBackInterface itfs = new CallBackClass();
itfs.callBackMethod();
}
}
现在可以调用试试看了:
public class Test {
public static void main(String[] args) {
new CallBackTest().showCallBack();
}
}
没意外的话,会成功输出hello,反正我这边是的.
例子看完了,所以说我做了什么呢? 再详细点说,我们有一个要在某一个方法里被调用的方法(这个方法就是回调方法), 前面我们也说了,最好不要直接把想要回调方法做的事直接写在调用方法里, 又因为java里没法把方法当做参数传递,所以我们只好把这个回调方法放在了接口里(为什么不是类?不是抽象类?而是接口?你可以自己去找下抽象类与接口的异同,自己解决这个问题)。有接口的话,就要被类实现,然后,只要是给接口的对象赋予实现类的对象,这个接口的对象就可以调用那个方法了。理解这里的话,有一个重点,就是多态, 这里用到的多态知识就是,接口的对象可以顺利被子类赋值,并且调用子类的重写方法(类也有类似的概念)。
再多说一点,这里任何实现了CallbackInterface接口的类,都可以像下面这样放在new后面(就是赋值):
public class CallBackTest {
interface CallBackInterface {
void callBackMethod();
}
class CallBackClass implements CallBackInterface {
@Override
public void callBackMethod() {
System.out.println("hello");
}
}
class Controller {
private CallBackInterface cbitf;
// 这个boolean只是为了模拟有事件,没啥实用价值
public boolean somethingHappend;
// 这里确实可以直接把CallBackClass做参数,而且省掉接口的定义
// 但是这样做的话,就像是回调函数直接写在了调用函数里一样
// 不明白的话就好好理解下"约定"和"调用者不管回调函数是怎么实现的"吧
public Controller(CallBackInterface itfs) {
somethingHappend = true;
this.cbitf = itfs;
}
public void doSomething() {
if(somethingHappend) {
cbitf.callBackMethod();
}
}
}
public void showCallBack() {
CallBackClass cbc = new CallBackClass();
Controller ctrlr = new Controller(cbc);
ctrlr.doSomething();
// 其实上面也可以这样写在一行里
// new Controller(new CallBackClass()).doSomething();
}
}
最后多说一点,其实这种应用在android里会经常遇到,我就是在学android的时候遇到的。


猜你喜欢
- 本文实例讲述了Android编程获取网络连接方式及判断手机卡所属运营商的方法。分享给大家供大家参考,具体如下:问题:项目中写的网络模块,感觉
- #region 解压 文件 zip 格式 rar 格式
- PageAdapter是一个抽象类,直接继承于Object,导入包android.support.v4.view.PagerAdapter即
- 01: 异步任务02: 定时任务一、SpringBoot--任务:邮件任务1.1 添加依赖(增加邮件支持)pom.xml <depen
- 在Android开发过程中,有时会需要一些消息提示,大多数情况可以用dialog来做,但有些消息不需要用户去点击取消并且不能对用户体验产生影
- Android 打开相册选择单张图片实现代码
- 在实际的项目开发过中,当我们修改了某个java类文件时,需要手动重新编译、然后重新启动程序的,整个过程比较麻烦,特别是项目启动慢的时候,更是
- android在设计View类时,为了能储存一些辅助信息,设计一个一个setTag/getTag的方法。这让我想起在Winform设计中每个
- HTML是WEB的核心,互联网中你看到的所有页面都是HTML,不管它们是由JavaScript,JSP,PHP,ASP或者是别的什么WEB技
- 一、简介Mybatis-Plus(简称MP)是一个 Mybatis 的一个增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发
- 注解注解定义Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.栈栈 (Stack) 是一种运算受限的线性表, 遵循先进
- 本文介绍一个C#函数,可以实现计算文件的MD5值,可以用于文件传输后进行有效性校验。我们知道可以通过将一个字符串进行散列(Hash)运算得到
- 前言 Gallery的Item使用的是一个ImageView+TextView,并且为其设置了selector,当使用setSe
- Intellij IDEA 最突出的功能自然是调试(Debug),可以对Java代码,JavaScript,JQuery,Ajax等技术进行
- 模式介绍命令模式(Command Pattern) :在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被
- 问题之前项目能够正常运行,因为默认选择db0,后来新的需求来了,不是默认db0,而是给参数选择db。修改后代码如下,却报错NOAUTH Au
- 一、Images1、概述Image 类为Bitmap(位图) 和 Metafile(矢量图) 的类提供功能的抽象基类。Image类不能直接创
- Spring介绍:spring 使用基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。然而, Spring的用途不仅限于服务
- Nacos简介Nacos 英文全称为 Dynamic Naming and Configuration Service,是一个由阿里巴巴团队