Java的回调函数理解

回调函数就是在一个不确定实现的方法METHOD中用interface或者它的抽象方法留个口子,留给具体调用者(调用前边那个不确定的方法METHOD)在调用时提供具体实现来补上那个口子。 从而达到更灵活地编码的目的,也大大减少了子类的使用。
不好脑袋要短路,得捋一捋—>
在A类中定义了一个方法这个方法中用到了一个 接口和该接口中的抽象的方法, 但是此处抽象方法没有具体的实现, 需要B 类具体的去实现,
实现该方法后,它本身不会去调用该方法,而是传递给A类,供A 类,去调用这种机制就称为回调。

需求:
有个鸟飞行方式的类 人想通过这个类知道麻雀和鸵鸟的飞行方式

先声明一个飞行的接口

public interface FlyMethod {
    public abstract void FlyMeth();
}

麻雀类和鸵鸟类分别实现了这个接口并且具体实现了飞行方式的方法—>


public class tuoniao implements FlyMethod {

    /**
     * 实现接口并且具体实现自身的飞行方式
     * 鸵鸟 .java类  FlyMeth(String flymeth)具体实现自身的飞行方式
     *  本身不会去调用该方法,而是传递给鸟BirdFly类.java类,
     *    这个地方的传递方式是通过BirdFly.java中的构造函数传过来的
     *  看people.Java类的实现
     * */
    @Override
    public void FlyMeth() {
        // TODO Auto-generated method stub
        System.out.println("鸵鸟飞的方式---这哪会飞");
    }

}
--------------------------------------------------

public class maque implements FlyMethod {

    /**
     * 实现接口并且具体实现自身的飞行方式
     * 麻雀 .java类  FlyMeth(String flymeth)具体实现自身的飞行方式
     *  本身不会去调用该方法,而是传递给鸟BirdFly类.java类,
     *  这个地方的传递方式是通过BirdFly.java中的构造函数传过来的
     *  看people.Java类的实现
     * */
    @Override
    public void FlyMeth() {
        // TODO Auto-generated method stub
        System.out.println("麻雀的飞方式 --- 展翅翱翔");
    }

}

鸟飞行方式的类中用到了这个飞行接口以及方法但是没有具体的实现。通过自身的构造函数来传递得到飞行方式接口的事例,进而实现调用具体的麻雀或者鸵鸟的飞行方式的方法。这就是函数回调。

/**
 * Created by Carson_Ho on 17/8/11.
 * 回调函数就是在一个不确定实现的方法METHOD中用interface或者它的抽象方法留个口子,
 * 留给具体调用者(调用前边那个不确定的方法METHOD)在调用时提供具体实现来补上那个口子。
 * 从而达到更灵活地编码的目的,也大大减少了子类的使用
 *
 * 在鸟BirdFly类中定义了一个方法
 * 这个方法中用到了一个飞行方式得到接口FlyMethod和该接口中的抽象的飞行方式的方法
 * void FlyMeth(String flymeth);
 * 但是此处抽象方法没有具体的实现, 需要B 具体的鸟类麻雀和鸵鸟.java类去实现,
 * 麻雀和鸵鸟.java类  FlyMeth(String flymeth)具体实现自身的飞行方式
 * 麻雀和鸵鸟.java类实现该方法后,它本身不会去调用该方法,而是传递给鸟BirdFly类.java类,
 * 这个地方的传递方式是在BirdFly.java中的构造函数传过来的
 * 供A BirdFly.java类,去调用
 * 这种机制就称为回调。
 */
public class BirdFly {
    private FlyMethod flyMethod;

    public BirdFly(FlyMethod flyMethod) {
        this.flyMethod = flyMethod;
    }

    /**
     * 在鸟BirdFly类中定义了一个方法
     * 这个方法中用到了一个飞行方式得到接口FlyMethod和该接口中的抽象的飞行方式的方法
     * void FlyMeth(String flymeth);
     * 但是此处抽象方法没有具体的实现, 需要B 具体的鸟类麻雀和鸵鸟.java类去实现,
     * */
    public void MyFlyMethod(){
        if(flyMethod!=null){
            flyMethod.FlyMeth();
        }
    }
}

最后是人的希望


public class people {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        /**
         * 先创建一个具体的鸟的事例麻雀和鸵鸟
         * 然后把自身事例传给鸟飞BirdFly.java
         * 通过构造参数传过去,然后实现飞行方式的回调机制
         * 输出自身的飞行方式
         * */
        new BirdFly(new tuoniao()).MyFlyMethod();
        new BirdFly(new maque()).MyFlyMethod();

    }

}

执行结果:

鸵鸟飞的方式---这哪会飞
麻雀的飞方式 --- 展翅翱翔

参考:http://blog.csdn.net/a_running_wolf/article/details/49359923/

猜你喜欢

转载自blog.csdn.net/qq_15623599/article/details/77532903