您的位置:首页 > 其它

浅谈对回调函数的理解

2015-08-06 21:00 253 查看
回调函数的个人理解:你使用别人的类的方法,但是别人的函数却要调用你的代码。

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

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

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

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

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("这个方法体是我自己写的,方法名是别人固定的。我所在的类在其他类里面,所以是内部类。我所在的类又没有名称,所以我是匿名的,请叫我所在类为 匿名内部类");

}

});

}*/

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: