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区别
看似向上转型和接口回调是一回事。看下面两句话,均出自Thinking in Java
使用接口的核心原因:为了能够向上转型为多个基类型[1]。即利用接口的多实现,可向上转型为多个接口基类型(具体见《抽象与接口》章节6)。
从实现了某接口的对象,得到对此接口的引用,与向上转型为这个对象的基类,实质上效果是一样的。(此句摘自Thinking in Java 3rd 接口与内部类一章)
所以,我认为,这两个概念是从两个方面来解释一个行为。接口回调的概念,强调使用接口来实现回调对象方法使用权的功能(下一章节详细分析)。而向上转型则牵涉到多态和运行期绑定的范畴。

3.用java接口实现回调函数
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
原创粉丝点击