public interface TextListener {

public void excute();

}

可以看到,接口中并没有excute()方法的具体实现。

接下来创建一个类:Text,这个类中包含了几个东西:第一个,TextListener的集合,因为可以为Text添加多个TextListener监听,因此,用一个集合来保存所有的监听;第二个addTextListener(TextListener

tl),这个方法是给Text注册监听的,说的通俗一点,就是把一个新的监听添加到TextListener集合中去;第三个方法removeListener(TextListener

tl),顾名思义,就是把某个监听从监听集合中移除,第三个方法叫excute(),这里不要和TextListener中的excute()方法混淆了,这个方法的作用就是回调注册了的TextListener,执行其中的代码。

import java.util.List;

import java.util.Vector;

public class Text {

private List listeners = new Vector<>();

public Text() {

}

public void addTextListener(TextListener listener) {

listeners.add(listener);

}

public void removeTextListener(TextListener listener) {

listeners.remove(listener);

}

public void excute() {

for (TextListener t : listeners) {

t.excute();

}

}

}

注:Text中的excute()方法,实际上就是遍历监听集合中的所有元素,依次调用TextListener的excute()方法。额。。。希望没有把这两个excute方法混淆了,命名可以随便改。

然后,写一个main函数,来运行着写代码:

public static void main(String[] args) {

Text text = new Text();

text.addTextListener(new TextListener() {

@Override

public void excute() {

System.out.println("cc is better man");

}

});

text.addTextListener(new TextListener() {

@Override

public void excute() {

int size = 100;

int rst = 0;

for (int i = 0; i < size; i++) {

rst += i;

}

System.out.println("the sum of 0 to 100 is :" + rst);

}

});

text.excute();

}

说明:首先创建了一个Text对象,再为Text对象添加了两个TextListener的监听,每个监听里面实现的excute()方法不一样,最后,再调用text.excute()方法,就会依次执行注册了的监听。在这个地方,由于text中,监听集合实际上是一个接口的集合,Text并不知道调用接口的excute()方法后,会执行什么代码,在注册的时候,接口的excute()方法的实现,也不会执行,所以,为text添加监听的时候,text也不知道自己在执行excute()方法的时候,输出结果是什么。

对于这种基于注册机制,来调用接口方法的用法,就是回调机制。

按道理来讲,在添加监听的时候,是实现了一个接口的,也就是说,在这个时候,创建了一个接口的实例,并且将这个实例放在内存中了,text的addTextListener方法,实际上存了一个这个接口实例的一个引用地址。当执行text.excute()方法的时候,会根据注册的TextListener的内存地址,来找到这个监听接口的实例,然后再调用TextListener的excute方法。

其实,上述代码还有一种写法,那就是创建一个类,实现TextListener接口的excute()方法,然后,new一个这个类,把这个类注册到text的监听里面,也能够实现同样的效果。

代码如下:

public class TextListenerImpl

implements TextListener {

@Override

public void excute() {

System.out.println("回调了这个方法~~~~~");

}

}

text.addTextListener(new

TextListenerImpl());//此为注册方法

其实这样子看的话,会比较清晰,当然,这个TextListener的实现类中的excute方法具体要执行什么,text依然不知道。

不知道这样子有没有说清楚。先这样吧。

java回调和监听的区别_java监听机制的原理-回调机制相关推荐

  1. JAVA中重写和实现的区别_Java中重载和重写的区别

    Java中重载和重写的区别 1.1重载是什么 Overloading   方法重载是让类以统一的方式处理不同类型数据的一种手段,多个同名函数同时存在,具有不同的参数个数/类型 1.2为什么用重载 重载 ...

  2. java 监听文件内容_java 监听文件内容变化

    有时候,我们需要确定某些文件是否有变化而做出一些对应的动作,例如,曾经开发的一款服务器中,由于模块比较多,在运行期间有时候需要单独的输出某个模块日志,但又不可能总是开着日志. log4j中已经实现了可 ...

  3. Java传统的io和nio区别_Java中IO和NIO的本质和区别

    简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...

  4. java中int和integer的区别_Java异常中throw和throws关键字的区别

    Java中常常弄混的两个关键字,throw和throws,它们有什么区别呢?如何记忆他们,而不至于出错呢? throw和throws 区别 throws:出现在方法的签名中,声明当前方法可能抛出的所有 ...

  5. java中堆与栈的区别_java中堆和栈的区别分析

    堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...

  6. java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  7. java字符流和字节流的区别_java字符流与字节流的区别是什么

    java中字符流与字节流的区别: 1.字节流操作的基本单元为字节:字符流操作的基本单元为Unicode码元. 2.字节流默认不使用缓冲区:字符流使用缓冲区. 3.字节流通常用于处理二进制数据,实际上它 ...

  8. java 策略模式和工厂模式区别_Java编程细节——什么是策略模式

    策略模式应该是Java设计模式中最简单的一种模式, 它的核心思想是,一个类的行为可以在运行时动态改变,有不同的实现逻辑. 其实具体的说,它也是基于面向接口编程的思想,通过定义不同的实现类逻辑来做到的. ...

  9. java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别

    对于JDK8而言,有三种实现对象比较的方法: 1.在需要比较的对象类中覆写Object类的equals()方法: 2.需要比较的类继承Comparable接口,然后在其类内部实现compareTo() ...

最新文章

  1. JQuery操作下拉框
  2. 赠书:Apache顶级项目,SkyWalking为何一枝独秀?
  3. 2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂
  4. apache camel_您的Apache Camel应用程序现在包括现成的文档
  5. 获得Class引用的三种方式?Class.forName()、getClass以及.class的使用
  6. linux shell脚本备份mysql数据库
  7. 视觉推理新杀器!英特尔新一代VPU性能翻10倍,反超英伟达
  8. asp.net学习之GridView
  9. 计算机二级基础知识微盘,计算机二级C++基础知识(整理版).pdf
  10. Qt编写自定义控件29-颜色选取面板
  11. revit API 实现可停靠窗口
  12. 同步、异步、堵塞、非堵塞概念总结
  13. 剑指Offer——二叉树中和为某一值的路径
  14. 朋友们给《Java程序员,上班那点事儿》的赠言
  15. Kaggle 大师访谈:我的 ML 竞赛之旅
  16. 自己组装电脑后怎么装Win10系统教学
  17. 如何去掉快捷方式上的小箭头
  18. 七彩虹 iGame G-ONE Plus 27寸游戏一体机 评测
  19. Windows下利用Chrome调试IOS设备页面
  20. 政考网:公务员考试备考攻略!

热门文章

  1. Office 2016 到底有没有更新?
  2. 面向对象思想的设计原则概述
  3. 多线程: 多线程中断机制
  4. 设计模式之工厂方法的重载
  5. Discuz常见小问题-如何为每个板块设置不同的图标
  6. 对话Pauly Comtois:赫斯特商业媒体中的企业DevOps采用
  7. 软键盘遮挡住popupWindow问题
  8. 玩转Python大数据分析 《Python for Data Analysis》的读书笔记-第08页
  9. Netbackup Done status 6 解决方法
  10. GBT19668.3-2007 电子设备机房系统工程监理规范