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();
}


        }

        


        运行结果如下:

        

posted @ 2018-05-14 17:13  IT蓝月  阅读(132)  评论(0编辑  收藏  举报
Live2D