回调的原理

        什么是回调?先举个例子再总结,不然说得挺抽象的

        首先要知道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里面对应的方法

 关于匿名内部类:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值