什么是回调?先举个例子再总结,不然说得挺抽象的
首先要知道C++里面是多继承的,这样就会形成多对多的关系,十分复杂。所以Java里面只支持单继承,一个类只能继承一个父类。但是这样有个缺点,如果子类想实现其它类的方法,那怎么办? 所以接口就登场了,子类可以实现多个接口确保实现各种想要的方法。
接口,也就是interface可以理解成角色,先具体的例子理解回调的原理:
package com.example.javaproject;
/**
* 第一步,要有接口,interface可以理解为角色,里面的方法规定角色需要满足什么样的条件
*比如我这里规定男主角这个角色要会武功,即有kungFu这个方法
*/
interface LeadingRole{
void kungFu();
}
/**
* 第二步,要有类来实现接口
* 换句话说,就是要有演员来演这个角色
*/
class Actor implements LeadingRole{
String name ;
String kungFuName;
public Actor(String name,String kungFuName) {
this.name=name;
this.kungFuName=kungFuName;
}
@Override
public void kungFu() {
System.out.println("我是"+name+",这是我的"+kungFuName);
}
}
/**
* 第三步,某个类里面调用接口的方法,但是只调用,不实现方法里面的具体操作,具
* 体的操作由实现这个接口的类确定,所以需要把实现了这个接口的类的对象传进来
* 比如我这里定义一个电影类,调用男主角的kungFu,但是怎么打还是要看具体的演员
*/
class Film{
LeadingRole mLeadingRole;
public void setLeadingRole(LeadingRole mLeadingRole){
this.mLeadingRole=mLeadingRole; //这里明确主角是哪个具体的演员,所以我们要通过setLeadingRole把具体的演员传进来
mLeadingRole.kungFu();//拍打戏,调用具体演员的kungFu方法
}
}
/**
* 第四步,开始使用
* 类似于开始找合适的演员,开始拍戏了
*/
public class FilmCompany {
public static void main(String [] args){
Film huangFeiHong=new Film();
Actor liLianJie=new Actor("李连杰","佛山无影脚");
Actor chengLong=new Actor("成龙","醉拳");
huangFeiHong.setLeadingRole(liLianJie);//把具体演员传进去
huangFeiHong.setLeadingRole(chengLong);
//还有另外一种方法,通过匿名内部类,直接new接口,相当于生成一个实现该接口的对象,如下:
huangFeiHong.setLeadingRole(new LeadingRole() {
@Override
public void kungFu() {
System.out.println("我是赵文卓,这是我的佛山无影脚");
}
});
}
}
打印:
可见,我们传入不同的演员,打印是不同的。上面的情景可以概括如下:
interface AA{ eat() };
class MyClass implements AA{ eat(){ 具体实现 } }
则
MyClass myClass=new MyClass();
AA aa ;
aa= myClass;是合法的
aa.eat()相当于调用到myclass的eat()
这样如果又有第二个类MyClass2实现AA接口,令aa=myclass2,则aa.eat调用的是myclass2里面的eat()
这样如果又有第三个类MyClass3..........调用的是myclass3里面的eat()
所以个人理解回调就是 调用接口某个方法的时候,回头调用的却是实现了这个接口的类的对应方法。怎么做到的?这就需要我们传入实现了接口的类的具体对象比如myClass,令接口的引用等于它比如aa=myClass,调用的就是MyClass里面对应的方法
关于匿名内部类: