接口回调

接口回调定义

  • 接口和类一样,是Java中的一种数据类型,用接口声明的变量称之为接口变量
  • 接口变量中存储的是实现了该接口的类的实例的引用

接口回调借用了C语言中指针回调的术语,

指针回调,表示一个变量的地址在某一时刻存放在一个 指针变量 中,这个 指针变量 可以间接操作该变量中存放的数据;

接口回调,指的是可以把实现某一接口的类创建的对象的引用赋值给该接口声明的接口变量,那么该 接口变量就可以调用被类实现的接口方法。(其实当 接口变量 在调用被类实现的接口方法时,就是在通知相应的对象调用这个方法)

<mark>但是接口变量无法调用类中其他的非接口方法</mark>;
(类似于上转型对象调用子类重写的方法)

例如:Com为接口,ImpleCom为实现了该接口的一个类;
<mark>Com com</mark>:此时com为一个空接口;
<mark>ImpleCom object = new ImpleCom()</mark>:创建一个实现Com接口的对象object;
<mark>com = object</mark>:此时com能够操纵object实现的接口的方法;

接口回调与多态

把实现接口的类的实例的引用赋值给接口变量后,该接口变量就可以回调类重写的接口方法。

不同的类在实现同一个接口时可能具有不同的实现方式,那么接口变量就在回调接口方法时可能具有多种形态。

接口参数

如果一个方法的参数为<mark>接口类型的数据</mark>,那么可以将任何<mark>实现该接口的类的实例的引用</mark>传递给该参数,接口参数也可以回调类实现的方法

接口回调

  1. 定义接口
  2. 定义方法,方法参数为接口,方法中调用接口
  3. 调用该方法,传入的一个接口实现类

示例

1)首先定义一个类Caller,按照上面的定义就是程序员A写的程序a,这个类里面保存一个接口引用。

public class Caller {
   
    //保存一个接口引用
    private MyCallInterface callInterface;
    public Caller() {
   
    }
    public void setCallFunc(MyCallInterface callInterface) {
   
         this.callInterface = callInterface;
    }
    public void call() {
   
         callInterface.printName();
    }
}

2)当然需要接口的定义,为了方便程序员B根据我的定义编写程序实现接口。

public interface MyCallInterface {
   
     public void  printName();
}

3)第三是定义程序员B写的程序b实现接口。

public class Client implements MyCallInterface {
   
     @Override
     public void printName() {
   
          System.out.println("This is the client printName method");
     }
}

4)测试如下

public class Test {
   
    public static void main(String[] args) {
   
         Caller caller = new Caller();
         caller.setCallFunc(new Client());
         caller.call();
    }
}

5)也可以在测试方法中直接使用匿名类,省去第3步。

public class Test {
   
    public static void main(String[] args) {
   
        Caller caller = new Caller();
        //caller.setCallFunc(new Client());使用匿名类代替
        caller.setCallFunc(new MyCallInterface() {
   
            public void printName() {
   
                 System.out.println("This is the client printName method");
            }
        });
        caller.call();
    }
}