最近学习内部类的时候,对java实现回调函数机制有了进一步了解,自己整理点比较,希望大家可以相互讨论。
所谓回调,就是允许客户类通过内部类引用来调用其外部类的方法,这是一种非常灵活的功能。
由于java暂时还不能显示支持闭包(Closure),不过听说新版可以支持了,不过我还没用过。现在暂时用的是非静态内部类实现回调功能。
情形一:
假设有一个老师Teacher对象,平时的工作是上课,周末的工作在家干农活(乡村老师大部分都这样),方法名都是work,但功能都不一样,可以用内部类实现这种需求:
public class Teacher { // 正常的工作 public void work() { System.out.println("平常我在给学生教课"); } // 业余的工作 public void farming() { System.out.println("周末我在农田忙活"); } private class Farmer { // 非静态内部类回调外部类实现work方法, // 非静态内部类引用的作用仅仅是向客户提供一个回调外部类的途径 public void work() { farming(); } } public Farmer getCallbackReference() { return new Farmer(); } public static void main(String[] args) { Teacher t = new Teacher(); // 直接调用work t.work(); // 表面上调用的是Farmer的work方法,实际上是回调Teacher的farming方法 t.getCallbackReference().work(); } }
情形二:
Swing中响应按钮点击事件,使用匿名内部类,各个不同的控件发生事件后可以回调外部类中对应的处理方法。
public class ButtonFrame extends JFrame { // 红色按钮 private JButton redButton = new JButton("Red Button"); // 蓝色按钮 private JButton blueButton = new JButton("Blue Button"); // 处理红色按钮的方法 private void processRedButton() { System.out.println("红色按钮被点击了"); } // 处理蓝色按钮的方法 private void processBlueButton() { System.out.println("蓝色按钮被点击了"); } public ButtonFrame() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); redButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 回调ButtonFrame中处理红色按钮的方法 processRedButton(); } }); blueButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 回调ButtonFrame中处理蓝色按钮的方法 processBlueButton(); } }); getContentPane().add(redButton); getContentPane().add(redButton); } public static void main(String[] args) { new ButtonFrame().setVisible(true); } }
最后,顺便提一下C语言中实现这种回调的机制,就是利用函数指针的方式实现的。在《Pointers On C》这本书里面举了一个例子很详细的说明这个问题:
要编写一个类型无关的函数,在一个链表中查找一个指定的值,这个链表的数据元素可以是整数,也可能是字符串等,所以函数的参数就不能特定类型,C语言里面有个void类型,可以指向任何类型,通过这个,可以编写一个与类型无关的链表查找函数:
/** * 在一个单链表中查找一个指定值的函数。它的参数是一个指向链表第1个节点的指针, * 一个指向我们需要查找的指针和一个函数的指针,它所指向的函数用于比较存储于链表 * 中的类型的值 * */ #include ; #include ; /*类型无关的链表查找*/ Node * search_list() (Node *node, void const *value, int (*compare) (void const *, void const *)) { while (node != NULL) { if (compare( &node->value, value) == 0) { break; } node = node->link; } return node; }
本人博客已搬家,新地址为:http://yidao620c.github.io/
相关推荐
java 回调函数 自己模拟实现 使用了接口来完成
java回调函数
该资源包含一个简单的实现java的回调函数简单易懂。
Java面试如何用Java实现一个回调函数
java自定义回调函数代码,SDK开发.对后续编写自己的SDK有帮助!
Java多线程实现 自定义 的 回调函数. 手写 完成,亲测 完成,可以 直接运行,Demo ,具有一定参考价值,供大家阅读 下载,谢谢
JNA 回调函数工作不稳定现象处理 (绝大多数回调不稳定的原因)
回调函数被连续执行两次或多次的原因: 根本原因:回调函数的事件预订【+=】语句被执行了两次或多次。 实例:移动web页的代码页类MobileDefault的Page_Init事件过程,包含的InitializeComponent()连续出现了两次...
亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。
Java 回调函数详解 前言: C语言中回调函数解释: 回调函数(Callback Function)是怎样一种函数呢? 函数是用来被调用的,我们调用函数的方法有两种: 直接调用:在函数A的函数体里通过书写函数B的函数名来调用...
NULL 博文链接:https://z251257144.iteye.com/blog/1331507
Java回调函数的理解。通过在Android小程序下运行一个Java回调程序。代码内部有简单讲解。
java中的回调函数.docx
java开发总结对回调函数的理解,以及描述,举例等..................
某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出...我的手机号码应该有效并且手机能够接收到你的呼叫,这是回调函数必须符合接口规范。
这个程序是我在理解回调函数时编写的一个Demo. 里面包含了三部分: 1.回调函数 2.观察者模式 3.代理模式 配套有CSDN博文:关于回调函数的理解,以及观察者模式,代理模式
Java 回调函数详解及使用
Java回调函数详解共6页.pdf.zip
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数
java实现--企业微信回调配置案例及工具代码