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();
}
}
运行结果如下: