• Java 接口回调


            众所周知,Java取消了C++的多继承机制,但是用另一种方式来间接的实现了多继承------接口!

            抽象类是对事物本质整体的抽象,而接口是对事物部分动作的抽象,Java中不允许多继承,但允许实现多接口,换句话说,抽象类也是类,虽然抽象类在某种程度和接口类似,可以实现同样的功能,但是,接口就是接口,类就是类,要实现C++中的多继承,只能用接口,虽然在单继承方面抽象类和接口很类似。


            接口就是徒弟去完成师傅生前没有完成的遗愿!

            继承就是儿子遗传了爸爸所有能够遗传给他的基因!


            接口是用来干什么的?

            ------接口中定义的方法只能由实现这个接口的类去完成。

            接口回调是干什么的?

            ------A类实现C接口所有的抽象方法,但不自己调用C接口中的所有的抽象方法,总会至少留一个抽象方法交给B类去调用(一般在B类中有一个未实例化的C接口对象雏形(现在还不能称之为对象,因为抽象类不能实例化,继而无法判断它需要多大内存空间,因此无法new给他合适的内存空间,因为Java不是C/C++,不允许使用类似malloc的函数去自由随意的给变量分配内存空间),一般在B类中也会有一个方法去把A类new出来的那个对象赋值给B类中的那个C接口对象雏形,从而在B类不继承C接口的前提下完成对B类中C接口对象雏形的实例化,在这种前提下,B类和A类就实现了通信,而实现他们之间通信的使者,就是B类中的那个C接口的对象(对象雏形)),B类通过A类间接对C接口调用的过程就是回调,回调也是A,B类信息沟通的重要基础。


            下面,通过一个例子,把回调机制练习一遍:

            故事概况:老板每天都要坐车到达公司,然后给员工下达工作的命令,等到员工完成工作后,告诉老板已经完成工作,等到老板检查完成状况通过后,员工才可以下班。

            代码实现:

            首先,新建一个工程,创建一个接口名为Person,

            创建三个类,一个是Boss类(老板),一个是Worker类(员工),一个是Main类。

            接口Person中的代码如下:

            public interface Person {


    public abstract boolean is_release();

    public abstract boolean is_checked(boolean is_finshed);

            }


            Boss类的代码如下:

            public class Boss implements Person{

    private int is_array = 0;



    @Override
    public boolean is_release() {

    if(is_array >= 3){

    System.out.println("命令已发布");
    return true;
    }

    System.out.println("您还未到达公司,不能发布命令");
    return false;
    }


    @Override
    public boolean is_checked(boolean is_finished) {

    if(is_finished){

    System.out.println("检测完成");
    return true;

    }else{

    System.out.println("员工工作尚未完成,检测失败");
    }

    return false;
    }

    public void go(){

    System.out.println("前进一公里");
    is_array++;
    }



            }


            Worker类的代码如下:

            public class Worker {

    private int work = 0;

    public Person person;

    public Boss bind(Boss boss){

    this.person = boss;

    return boss;
    }

    public void on(){

    if(person.is_release()){

    System.out.println("老班已经发布工作,可以开始了");

    }else{

    System.out.println("尚未发布工作,请等待");
    }
    }

    public void off(){

    if(is_finished() && person.is_checked(is_finished())){

    System.out.println("工作已经完成,可以下班");

    }else{

    System.out.println("工作还没完成,不允许下班");
    }
    }

    public boolean is_finished(){

    if(this.work >= 3){

    return true;
    }

    return false;
    }

    public void job(){

    work++;
    System.out.println("员工正在工作");
    }

            }


            Main类的代码如下:

            public class Main {


    public static void main(String[] args) {
    // TODO 自动生成的方法存根
    Boss boss = new Boss();
    Worker worker = new Worker();


    boss = worker.bind(boss);

    boss.is_release();

    boss.go();
    worker.on();

    boss.go();
    boss.go();

    worker.on();
    worker.off();

    worker.job();
    worker.job();
    worker.job();

    worker.off();
    }


            }

            


            运行结果如下:

            

  • 相关阅读:
    结合源码理解Spring MVC处理流程
    Spring Bean的生命周期分析
    面试官:给我说一下你项目中的单点登录是如何实现的?
    Java中的四种引用
    JWT实战总结
    Java读写锁的实现原理
    深入的聊聊Java NIO
    一线大厂Mysql面试题详解
    脱发、秃头防不胜防?这里有一份给码农的减压指南
    手把手教你提高代码Java运行的效率
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700725.html
Copyright © 2020-2023  润新知