接口回调
需求:
A在执行循环,当循环到5的时候, 通知B。
事先先把一个对象传递给 A , 当A 执行到5的时候,通过这个对象,来调用B中的方法。 但是注意,不是直接传递B的实例,而是传递一个接口的实例过去。
1.新建A.java
package com.rick.test;
/**
* 假设这是1988年写的
* @author xiaomi
*
*/
public class A {
/**
* 这是以前的java基础使用的代码。
* 但是假设这个A这个类是早在上个世纪80年 就写好的A类, 这个方法 内部是不能直接new B()
* 1. 不能直接new B
*
* 2. 页不能传递B的实例进来。
*
* 所以在定义这个方法的时候,不管未来写的是B 类, 还是C类,还是D类, 人家为了通用。
* 所以定义了一种接口,只要让未来的那些类,实现这个接口。 然后这个方法的参数写 接口类型即可。
*/
/*public void print(){
for (int i = 0; i < 10; i++) {
System.out.println("循环到了--"+i);
if(i == 5){
System.out.println("循环到了5了,该通知B 了。");
B b = new B();
b.printFive();
}
}
}*/
public void print(PrintListener listener){
for (int i = 0; i < 10; i++) {
System.out.println("我在1988年就开始打印这个语句了。。循环到了--"+i);
if(i == 5){
System.out.println("循环到了5了,该通知B 了。");
listener.print();
/*B b = new B();
b.printFive();*/
}
}
}
}
2.新建PrintListener.java接口
package com.rick.test;
/**
* 1988年写
* 打印监听器
* @author xiaomi
*
*/
public interface PrintListener {
/**
* 一旦出现了某一种事件, 达到了某一个状态,就调用这个方法。
*/
void print();
}
3.新建接口实现类B.java
package com.rick.test;
/**
* 2018
* @author xiaomi
*
*/
public class B implements PrintListener{
/*public void printFive(){
System.out.println("A已经循环到了5, 所以B的这个方法将被调用");
}*/
@Override
public void print() {
System.out.println("2018年。。。A已经循环到了5, 所以B的这个方法将被调用");
}
}
4.测试
package com.rick.test;
public class Test {
public static void main(String[] args) {
A a = new A();
//这是多态的体现,
/*
* 这个方法咋i1988年就定义了要收 printlistener 这个接口的类型。
* 在2018年的时候有一个类 B 实现了这个接口printlistener ,
* 所以现在可以传递B进来
*/
a.print(new B());
}
}