java回调和监听的区别_java监听机制的原理-回调机制
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监听机制的原理-回调机制相关推荐
- JAVA中重写和实现的区别_Java中重载和重写的区别
Java中重载和重写的区别 1.1重载是什么 Overloading 方法重载是让类以统一的方式处理不同类型数据的一种手段,多个同名函数同时存在,具有不同的参数个数/类型 1.2为什么用重载 重载 ...
- java 监听文件内容_java 监听文件内容变化
有时候,我们需要确定某些文件是否有变化而做出一些对应的动作,例如,曾经开发的一款服务器中,由于模块比较多,在运行期间有时候需要单独的输出某个模块日志,但又不可能总是开着日志. log4j中已经实现了可 ...
- Java传统的io和nio区别_Java中IO和NIO的本质和区别
简介 终于要写到java中最最让人激动的部分了IO和NIO.IO的全称是input output,是java程序跟外部世界交流的桥梁,IO指的是java.io包中的所有类,他们是从java1.0开始就 ...
- java中int和integer的区别_Java异常中throw和throws关键字的区别
Java中常常弄混的两个关键字,throw和throws,它们有什么区别呢?如何记忆他们,而不至于出错呢? throw和throws 区别 throws:出现在方法的签名中,声明当前方法可能抛出的所有 ...
- java中堆与栈的区别_java中堆和栈的区别分析
堆和栈是Java数据结构里非常重要的概念,本文较为详细的分析了二者之间的区别.供大家参考.具体如下: Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newarray.an ...
- java中string 和stringbuffer的区别_Java中的String,StringBuilder,StringBuffer三者的区别...
最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...
- java字符流和字节流的区别_java字符流与字节流的区别是什么
java中字符流与字节流的区别: 1.字节流操作的基本单元为字节:字符流操作的基本单元为Unicode码元. 2.字节流默认不使用缓冲区:字符流使用缓冲区. 3.字节流通常用于处理二进制数据,实际上它 ...
- java 策略模式和工厂模式区别_Java编程细节——什么是策略模式
策略模式应该是Java设计模式中最简单的一种模式, 它的核心思想是,一个类的行为可以在运行时动态改变,有不同的实现逻辑. 其实具体的说,它也是基于面向接口编程的思想,通过定义不同的实现类逻辑来做到的. ...
- java可比较的和比较器的区别_Java中Compareable和Comparator两种比较器的区别
对于JDK8而言,有三种实现对象比较的方法: 1.在需要比较的对象类中覆写Object类的equals()方法: 2.需要比较的类继承Comparable接口,然后在其类内部实现compareTo() ...
最新文章
- JQuery操作下拉框
- 赠书:Apache顶级项目,SkyWalking为何一枝独秀?
- 2015多校10 1006.CRB and Puzzle HDU5411(邻接矩阵求k长路条数,矩阵快速幂
- apache camel_您的Apache Camel应用程序现在包括现成的文档
- 获得Class引用的三种方式?Class.forName()、getClass以及.class的使用
- linux shell脚本备份mysql数据库
- 视觉推理新杀器!英特尔新一代VPU性能翻10倍,反超英伟达
- asp.net学习之GridView
- 计算机二级基础知识微盘,计算机二级C++基础知识(整理版).pdf
- Qt编写自定义控件29-颜色选取面板
- revit API 实现可停靠窗口
- 同步、异步、堵塞、非堵塞概念总结
- 剑指Offer——二叉树中和为某一值的路径
- 朋友们给《Java程序员,上班那点事儿》的赠言
- Kaggle 大师访谈:我的 ML 竞赛之旅
- 自己组装电脑后怎么装Win10系统教学
- 如何去掉快捷方式上的小箭头
- 七彩虹 iGame G-ONE Plus 27寸游戏一体机 评测
- Windows下利用Chrome调试IOS设备页面
- 政考网:公务员考试备考攻略!