浅谈对回调函数的理解

回调函数的个人理解:你使用别人的类的方法,但是别人的函数却要调用你的代码。

其实回调函数并没有想象中的那么神秘。举个例子:别人已经写好的类的方法需要调用你实现的代码,该怎么调?

答:别人在设计的时候就只需要给你一个接口,你在使用别人的代码的时候,只需要将固定接口的子类对象 传给那份代码,就可以完成功能。

当那份代码执行的时候,去调用那个接口的方法,实际执行的是你提供的对象的方法(面向接口编程,接口指向子类对象),那么就可以调用到你的代码啦。

为了增强理解,给个简单的代码,先运行再观察:



package com.shusheng.Mytest;
/**
 * 这个类是别人已经写好的类,提供给我们使用
 * 别人想调用我的方法体,必须给我一个接口。
 * 打个不且当的比方:乞丐想要过路人的钱,那么他必须先给一个碗。(理解不了就忽略)
 * @author Administrator
 *
 */
public class OthersClass {
    //别人写好的类需要用到我的方法体。就给我一个Callback接口,让我实现里面的方法。然后我使用这个类的时候就将该接口的一个实例对象传进去。
    public void Say(Callback callback) {
        //设计的时候并不知道这个execute()方法体的内容。
            callback.execute();
            
    }
    
}



package com.shusheng.Mytest;
/**
 * 这个是别人提供给用户的一个接口,用户只需要实现该接口,将这个接口对象传进去,就可以使用别人的say()方法。
 * @author Administrator
 *
 */
public interface Callback {
    
    public void execute();

}



package com.shusheng.Mytest;

/**
 * 这个是我自己的类,我想使用OtherClass 的say方法,那么我必须传进去一个接口对应的对象,然后就可以使用那个say方法(居然别人写好的类可以调用我写的代码。简称回调)
 * @author Administrator
 *
 */
public class MyClass {

    public static void main(String[] args) {
    //我要使用别人的say方法。Say(callback),所以我要先实例化一个Callback的子类,然后将该对象传进say方法里面(注意别人提供的say是业务方法,execute()是需要你去填充的方法,say方法体调用execute方法)
        //构造一个子类,当然这个类可以在外面写,这里只是方便大家理解(内部类,和外部类都很少用)
        class MyCallback implements Callback {
            @Override
            public void execute() {
                System.out.println("这个是我的方法体,但是方法签名是别人提供的,我所在的类在其他类里面,所以我叫内部类,但我不是匿名类,因为类名叫MyCallback,");
            }
        }
        
    //new一个对象,准备将myCallback对象传进say方法
    MyCallback myCallback = new MyCallback();
        
    OthersClass others = new OthersClass();
    
    others.Say(myCallback);
}
    
    /*--------------------上面的main方法的形式很少用,请使用下面的方法-----------------------*/
    
    //下面使用匿名内部类,(很常用,因为代码很简练)。匿名内部类,跟上面实质是一样的。需要使用别人提供的Say(callback)方法,同样要传入一个Callback对象,
    //但是一个对象可以不要名称,(上面的对象名叫myCallback),可以只需要一个方法体。于是只需要new一个接口,然后将需要实现的方法实现了就是(匿名内部类)了。

    /*    public static void main(String[] args) {
        
        OthersClass others = new OthersClass();
            
        others.Say(new Callback() {
            
            @Override
            public void execute() {
            System.out.println("这个方法体是我自己写的,方法名是别人固定的。我所在的类在其他类里面,所以是内部类。我所在的类又没有名称,所以我是匿名的,请叫我所在类为  匿名内部类");
                
            }
        });
        }*/
    
}

你可能感兴趣的:(java概念)