Java基础:回调函数

这篇具有很好参考价值的文章主要介绍了Java基础:回调函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

因为在看Android代码的时候发现了许多关于回调函数的知识, 所以去了解了一下. 对于我来说不太好懂, 因为我觉得看的那些博文的讲法对我来说很绕, 所以我在理解了之后想写一篇关于回调函数的博文来给和我一样理解能力稍差的人一点帮助.

回调函数的作用其实就是将需要这个功能的调用者实现这个功能的被调用者分离. 

因为可以把调用者与被调用者分开,所以调用者不关心谁是被调用者。它只需知道存在一个具有特定原型和限制条件的被调用函数。

简而言之,回调函数就是允许用户把需要调用的方法的指针作为参数传递给一个函数,以便该函数在处理相似事件的时候可以灵活的使用不同的方法。

用我自己的理解简单来说,

1. 我创建了一个类需要用到一个功能(方法)

2. 于是我先创建该功能的接口

3. 但是我不想自己实现这个功能, 而是想通过调用许许多多的实现该接口的类来完成, 这样的话遇到不同的需求我就可以调用满足该需求的类来实现, 更加的方便

4. 于是我创建了许许多多的类来实现该接口的功能,且每个类中的实现过程都不一样.

5. 那么我如何调用实现方法的类呢?  我将接口作为方法的参数, 这样就可以接受所有实现接口的类了(其实传入的是类的地址), 然后在方法中调用需要的功能方法即可. 

从别的博文摘的几句话:

把一段可执行的代码像参数传递那样传给其他代码,而这段代码会在某个时刻被调用执行,这就叫做回调

既然函数指针变量是一个变量,当然也可以作为某个函数的参数来使用的。

// 接口
package cn.ncepu.demo1.a02callbackdemo;

public interface Insert {
    public abstract void act();
}


// 实现接口1号
package cn.ncepu.demo1.a02callbackdemo;

public class Isused implements Insert{
    @Override
    public void act() {
        System.out.println("被调用者1号");
    }
}


// 实现接口2号
package cn.ncepu.demo1.a02callbackdemo;

public class Isused2 implements Insert{
    @Override
    public void act() {
        System.out.println("被调用者2号");
    }
}


// 调用者
package cn.ncepu.demo1.a02callbackdemo;

public class Use {

    // 第一种方式
    public Use(){
        System.out.println("调用者空参构造");
    };
    public void use(Insert insert){
        insert.act();
    }

    // 第二种方式
    // 可以声明成员属性为接口
    Insert insert;
    public Use(Insert insert){
        System.out.println("调用者直接将接口作为参数");
        this.insert = insert;
    }

    public void use2(){
        insert.act();
    }
}

// 测试
package cn.ncepu.demo1.a02callbackdemo;

public class Test {
    public static void main(String[] args) {
        Use u = new Use();
        final int Isused1 = 0;
        final int Isused2 = 1;
        final int CODE;
        CODE = Isused1;

        switch (CODE) {
            // 调用第一个实现接口的类的方法
            case Isused1 -> u.use(new Isused());

            // 调用第二个实现接口的类的方法
            case Isused2 -> u.use(new Isused2());
        }
    }
}

用一段话来总结下回调:上层模块封装时,很难预料下层模块会如何实现,因此,上层模块只需定义好自己需要但不能预料的接口(也就是回调接口),当下层模块调用上层模块时,根据当前需要的实现回调接口,并通过注册或参数方式传入上层模块即可,这样就实现下层调用上层,并且上层还能根据传入的引用来调用下层的具体实现,将程序的灵活性大大的增加了。

Java基础:回调函数

package cn.ncepu.demo1.a02callbackdemo2;

public class A {
    public void setOnMethodListener(MethodListener methodListener){
        methodListener.method();
    }

    public interface MethodListener{
        public abstract void method();
    }
}
package cn.ncepu.demo1.a02callbackdemo2;

public class B implements A.MethodListener {
    @Override
    public void method() {
        System.out.println("B类实现A类中的接口");
    }
}
package cn.ncepu.demo1.a02callbackdemo2;

public class Test {
    public static void main(String[] args) {
        A a = new A();
        // 直接写(new一个接口的匿名实现类)
        a.setOnMethodListener(new A.MethodListener() {
            @Override
            public void method() {
                System.out.println("直接写");
            }
        });

        // 调用类B
        B b = new B();
        // B类实现A类中的接口的方法
        a.setOnMethodListener(b);// 输出:B类实现A类中的接口
    }
}

参考博文 : 

Java接口回调机制 - 温布利往事 - 博客园 (cnblogs.com)

C语言回调函数详解(全网最全)_小熊coder的博客-CSDN博客_c语言回调函数文章来源地址https://www.toymoban.com/news/detail-442324.html

到了这里,关于Java基础:回调函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX-HAL库-UART串口接收中断回调函数代码分析

            CubeMx中HAL库函数的调用不同于库函数调用,在学习CubeMx串口通信时,不理解HAL库中的回调函数是怎么被调用的,于是查看每个的定义,参考其他人写的博客,总算弄明白了HAL库中断调用与库函数不同之处。写下这篇博客一是加深自己的理解,二是希望对不理解HA

    2024年02月02日
    浏览(51)
  • Android JNI复杂用法,回调,C++中调用Java方法

    Android JNI的 普通用法估计很多人都会,但是C++中调用Java方法很多人不熟悉,并且网上很多介绍都是片段的。 虽然C/C++调用Java不常用,但是掌握多一点还是有好处的。 Android JNI的基础知识介绍,之前已经有介绍,不熟悉的可以先看看: Android Jni的介绍和简单Demo实现: https://

    2024年03月26日
    浏览(48)
  • 微信小程序等待wx.requestPayment的回调函数执行完后再执行后续代码

    在开发微信小程序过程中,遇到如下需求: 需要等待wx.requestPayment的回调函数执行完后再执行后续代码 这是因为在调用wx.requestPayment之后,会弹出一个支付弹窗,如果此时点击右上角的 x ,那么将会执行wx.requestPayment的回调函数fail中的代码。而由于 wx.requestPayment 的回调函数是

    2024年02月09日
    浏览(40)
  • Android实战基础 - Java、Kotlin 代码互转

    在Android现阶段,Kotlin已经成为普遍性使用的语言,而在其使用阶段中Java和Kotlin的混用很常见,为了便于开发,我们需要掌握Java、Kotlin文件的转换 这应该是我以前刚学Kotlin时就想记录的一篇blog,没想到隔了这么久才进行记录(嗯… 主要这俩年好像有点忙…) 个人建议:正常

    2024年02月11日
    浏览(57)
  • Android Java代码与JNI交互基础数据类型转换(三)

    🔥 Android Studio 版本 🔥  🔥 基础类型数据的转换 🔥 定义传递基础数据类型到Native的JNI接口函数 Native层创建callNativeInt 提供给Java调用 CMakeLists.txt 文件下配置动态库名称  添加 target_link_libraries 配置 Java调用Native层函数   运行打印日志 Java调用Native分别打印基础类型数据  下

    2024年02月13日
    浏览(42)
  • java代码新增或修改时候的验证字段唯一

    java代码新增或修改时候的验证字段唯一

    2023年04月11日
    浏览(31)
  • 创建Android项目的时候发现MainActivity文件不是.java后缀,而是kt后缀

    第一次创建Android项目时,MainActivity文件发现没有继承,和我们平时Java文件内容也不一样  其实是我们创建项目的时候选择了Kotlin语言,我们只需要创建项目的进行进行语言更改就 好啦!   

    2024年02月15日
    浏览(44)
  • 【JavaEE基础学习打卡02】是时候了解Java EE了!

    📜 本系列教程适用于 Java Web 初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白视角呈现,帮助大家快速入门。 🎅 我是 蜗牛老师 ,之前网名是 Ongoing蜗牛 ,人如其名,干啥都慢,所

    2024年02月12日
    浏览(46)
  • C++回调函数 匿名函数,类中的方法做为回调函数

    C++中的回调函数和匿名函数都是函数指针或函数对象的使用形式。下面分别介绍它们的使用方法。 回调函数是一种函数指针,它允许将函数作为参数传递给另一个函数,并在需要时调用它。这种技术通常用于事件处理、异步处理和状态机等应用中。 下面是一个简单的示例,

    2024年02月01日
    浏览(45)
  • C/C++面向对象(OOP)编程-回调函数详解(回调函数、C/C++异步回调、函数指针)

    本文主要介绍回调函数的使用,包括函数指针、异步回调编程、主要通过详细的例子来指导在异步编程和事件编程中如何使用回调函数来实现。 🎬个人简介:一个全栈工程师的升级之路! 📋个人专栏:C/C++精进之路 🎀CSDN主页 发狂的小花 🌄人生秘诀:学习的本质就是极致

    2024年02月03日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包