Java接口回调的自我理解

在近期做获取通话记录的app的时候,设置RecycleView的每一个item的单击时间监听器的时候卡了很久(wtcl),因为涉及到接口回调,特此开一篇博客来说说自己的理解,以加深对这个抽象概念的认识。

概念

  1. 什么是接口(Interface)?
    • 接口是java语言的一种抽象类型,包含抽象方法(即没有方法的具体实现),一个类通过继承接口从而来继承接口的抽象方法。
    • 接口和类的不同之处
      1) 接口不能被实例化(没有构造方法)
      2) 接口中的方法都必须是抽象方法(即没有实现,只有声明)
      3) 接口不能包含成员变量,除了static和final变量
      4) 不能说类继承接口,而是说类实现了这个接口
      5) 接口可以多继承。
  2. 什么是回调?
    • 回调是调用方式的一种,调用方式可以分为三类:
      1) 同步调用:一种阻塞式的调用,即我们常用的在函数A中通过书写函数B的名字调用这个函数,这样要等待B函数执行完毕后A才能继续执行。
      2) 异步调用:类似Android的标准广播机制,同时受到且互不影响。
      3) 回调: 回调是一种双向的调用模式,也就是说,被调用的接口被调用时也会调用对方的接口,例如A要调用B,B在执行完毕后又要调用A。
    • 回调一般用于不同层级间的协作,上一层级将他的函数安装在下层,这个函数就是回调函数,而下层在一定条件下会出发回调。
  3. 什么是接口回调?
    • 在C/C艹中,实现回调函数很简单,只需要拿到这个函数的指针地址就可以了。但是在java中,我们没有指针,所以我们通过接口回调的方式来实现这一步骤,即:
      把实现某一个接口的类创建的对象的引用赋给这个接口声明的接口变量,那么该接口变量就可以调用被调用类实现的接口的方法。下面我们来通过几个例子来说明。

      举例说明

  • 较为简单的例子
    背景:xxjj对hllj说,你快点学习,我把我的联系方式给你,一旦一学习完了马上用这个联系方式给我解释你学了什么。

    联系方式——>xxjj对象的引用
    给我解释你学了什么——>这个接口的抽象方法的具体实现

  1. 先创建一个回调接口

    1
    2
    3
    public interface ExplainToXxjj{
    public void doExplain();//这里创造了一个接口,实现这个接口的类必须实现这个抽象方法。
    }
  2. 创建实现ExplainToXxjj接口的一个类

    1
    2
    3
    4
    5
    public class Xxjj implements ExplainToXxjj{
    public void doExplain(){
    System.out.println("向xxjj解释什么是接口回调");//这里的Xxjj类实现了ExplainToXxjj接口
    }
    }
  3. 创建控制改接口何时回调时的类,需要得到Xxjj的地址(即回调接口)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class Hllj{
    ExplainToXxjj explainToXxjj;//声明一个接口变量
    public Hllj(ExplainToXxjj explainToXxjj){
    this.explainToXxjj = explainToXxjj;
    }//在构造方法中,将接口变量的值初始化
    public void learn(){
    System.out.println("学习中...");
    explainToXxjj.doExplain();//在这里实现了回调,即通过接口变量调用被调用类实现的接口的方法(doExplain())
    }
    }
  4. 测试类

    1
    2
    3
    4
    5
    6
    7
    public class Test{
    public static void main(String [] args){
    Xxjj xxjj = new Xxjj;//创建一个新的Xxjj实例
    Hllj hllj = new Hllj(xxjj);//创建一个新的Hllj实例,并将刚才新建的Xxjj对象传进构造器。构造器则将这个实例的引用赋给了接口变量。
    hllj.learn();//此时调用Hllj的learn方法,然后learn方法中可以调用到Xxjj对象所实现的doExplainToXxjj方法。
    }
    }

代码运行过后的结果是:

学习中...
向Xxjj解释什么是接口回调

假如Xxjj把ExplainToXxjj的实现改成”一起BBT”那就是另一个故事了。

是不是感觉逻辑其实很简单,可以看做interface变量充当了C艹里的对象的指针(?个人理解233333不一定对奥)

  • 在Android开发中,接口回调被大量的使用,比如每一个单击事件监听器都使用了接口回调的方法,下面举例一个实际开发中的例子,为RecycleView的每一个item的单击事件监听器。