java - 接口回调讲解1
来源:互联网 发布:淘宝数据不是mtop格式 编辑:程序博客网 时间:2024/06/05 06:59
1.接口回调定义:可以把使用某一接口的类创建的对象的引用赋给该接口声明的接口变量,那么该接口变量就可以调用被类实现的接口的方法。实际上,当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法,这一过程称为对象功能的接口回调。
1.1我们来看一个简单的例子
interface People{ void peopleList();}class Student implements People{ public void peopleList(){ System.out.println("I’m a student.");}}class Teacher implements People{ public void peopleList(){ System.out.println("I’m a teacher.");}}public class Example{ public static void main(String args[]){ People a; //声明接口变量a=new Student(); //实例化,接口变量中存放对象的引用a.peopleList(); //接口回调a=new Teacher(); //实例化,接口变量中存放对象的引用a.peopleList(); //接口回调}}结果:I’m a student.I’m a teacher.再来看看向上转型(upcasting)的概念。
2.接口回调与向上转型的区别
2.1我们先来介绍一下什么是向上转型
Shape s=new Circle();
这里,创建了一个Circle对象,并把得到的引用立即赋值给Shape。通过继承,Circle就是一种Shape。
假设你调用基类方法(它已在导出类中被覆盖):
s.draw();
由于后期绑定(多态),将会正确调用Circle.draw()方法。
2.2区别
2.2区别
看似向上转型和接口回调是一回事。看下面两句话,均出自Thinking in Java。
使用接口的核心原因:为了能够向上转型为多个基类型[1]。即利用接口的多实现,可向上转型为多个接口基类型(具体见《抽象与接口》章节6)。
从实现了某接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。(此句摘自Thinking in Java 3rd 接口与内部类一章)
所以,我认为,这两个概念是从两个方面来解释一个行为。接口回调的概念,强调使用接口来实现回调对象方法使用权的功能(下一章节详细分析)。而向上转型则牵涉到多态和运行期绑定的范畴。
3.用java接口实现回调函数
java用接口回调实现了其他语言中的函数指针功能,我们再来举个例子。3.用java接口实现回调函数
package org.zj.sample;public interface InterestingEvent { public void interestingEvent ();}package org.zj.sample;public class EventNotifier { private InterestingEvent ie; private boolean somethingHappened; public EventNotifier(InterestingEvent event) { ie = event; // 保存事件对象以备后用。 somethingHappened = false; // 还没有要报告的事件。 } public void doWork() { if (somethingHappened) { // 检查设置的谓词。 ie.interestingEvent();// 通过调用接口的这个方法发出事件信号。 } } public void setHappened(){//设置谓词。 somethingHappened=true; }}package org.zj.sample;public class CallMe implements InterestingEvent { @SuppressWarnings("unused") private EventNotifier en; public CallMe() { // 注意 EventNotifier (InterestingEvent event),应该传递一个接口类型。 // 而下面将this,即实现了InterestingEvent接口的CallMe实例传递给//EventNotifier。也就是所谓的接口回调了。 en = new EventNotifier(this); // 创建事件通知程序,并将自身引用传递给它。 } // 为事件定义实际的处理程序。 public void interestingEvent() { System.out.println("Call me Hello."); }}package org.zj.sample;public class Test { public static void main(String[] args) { EventNotifier en=new EventNotifier(new CallMe()); en.setHappened(); en.doWork(); }}结果:Call me Hello.
0 0
- java - 接口回调讲解1
- java - 接口回调讲解2 - 将接口视为工厂
- Android接口回调形象讲解
- java之Collection接口讲解
- Java中Enumeration接口讲解
- 接口的作用|实例讲解java接口
- Java基础课程-接口、内部类、回调函数讲解
- Java中Collection子接口(1)——List接口(传智播客毕老师视频讲解)
- java回调机制讲解
- 【java】接口的作用|实例讲解java接口
- 【java】接口的作用|实例讲解java接口
- 【java】接口的作用|实例讲解java接口
- 实例讲解Java中的接口的作用
- 实例讲解Java中的接口的作用
- 实例讲解Java中的接口的作用
- 实例讲解Java中的接口的作用
- java抽象类和接口经典讲解
- java一个好玩的接口讲解
- 实现View上添加标签
- 4维数据显示 4 Dimensional visualization
- Google 多源码管理工具 gclient
- Swift中如何使用第三方库?
- 父子组件通信vue.js
- java - 接口回调讲解1
- 好用的 jquery tab切换
- Android活动的启动模式
- 关于echart的一个小例子
- torch入门笔记8:tensor
- 欢迎使用CSDN-markdown编辑器
- 感慨
- Android 中的 Service 全面总结
- PHP中常用加密函数介绍