首页 > 学院 > 开发设计 > 正文

回调函数的一点点个人见解

2019-11-06 08:17:51
字体:
来源:转载
供稿:网友

首先声明,我写的是java代码的回调函数。之前网上也看了很多的回调函数讲解。基本都是举自己的例子。(这里吐槽一下,例子你本身的人写出的肯定懂。但我这种新手还是一脸懵逼啊T_T表示新手别打脸)。回调函数怎么说呢,有时候给人的感觉还真是只可意会不可言传。所以,在这里,我尽量的用大家熟悉的东西给大家带来意会的感觉。

在这里,我先推荐大家先去网上看看其他大牛写的回调详解什么的。因为我是不是什么大牛,所以下面我讲的回调我也不知道是不是真的回调函数,如果你信得过我就继续往下看。

在这里我用的是线程作为例子,这是我觉得大家很熟悉的可以方便体会。(ps:当然,如果你没学过线程我真的很怀疑你有没有学过java =_=)。

来个线程的创建:(本来想用代码片的,但为防止以后链接失效,代码出不来没得看的尴尬情况。只能全部贴在界面上了)

new Thread(new Runnable() {			@Override			public void run() {							}		}).start();				//或者		Thread thread = new Thread(new Runnable() {			@Override			public void run() {							}		});		thread.start();				//还有		Runnable runnable = new Runnable() {			@Override			public void run() {							}		};		Thread thread2 = new Thread(runnable);		thread2.start();大家都不陌生吧,现在我们的重点在Runable这个接口上。我们进去看一下它的源码(ctrl+鼠标点击):

publicinterface Runnable {    public abstract void run();}你没看错,里面就一行代码。当时我看的时候心里也是万千只(what the fuck)跑过,你确定不是逗我->_->。所谓大道至简也许就是这样吧。

可以看出Runnable其实是一个接口,里面有一个run方法需要我们实现,到这里,我基本已经说完了。什么?回调没讲?其实我想说,刚刚new线程实现Runable接口,实现run方法的时候就已经是回调了。

看到这里,你也许已经有点感觉了吧?好了我们现在去看看其他网上的回调讲解。首先,我们看看他们讲的回调,所需要回调的函数是不是一定是一个接口,且里面有一个或多个方法?继续看,所谓的回调是不是把这个接口实现了?

好了,我们回头看一下上面代码中用到的Thread构造函数:public Thread(Runnable target);在此,我们来假设一下Thread只有这一个构造函数(其他的如public Thread()空参的构造函数都没有就只有public Thread(Runnable target)且里面的run方法改为public void run() {  target.run(); })。好了,如果我们想创建一个线程,那此时就必须实现Runalble接口。额,好像也说不太明白,好了,下面我来伪造这两个东西吧。上面的就不理了。解释一下小写m表示我的意思。(我下面的类开头用了小写,这是不规范的,大家看看就行了)

先来一个假的Runable(mRunable.java):别问我为什么不用上面的Runable。自力更生。

public interface mRunable {	public void run();}

再来一个假线程类(mThread.java):

public class mThread {	mRunable target;	public mThread(mRunable target) {		this.target = target;	}	public void run(){		target.run();	}}好了,如果我们要跑这个假线程该怎么做?是不是像下面那样(和线程一模一样只不过star变成了run   =_=):

public class Test2 {	public static void main(String[] args) {		new mThread(new mRunable() {			@Override			public void run() {				//执行代码			}		}).run();	}}

写得有点乱,大家不要介意哈。到这里。我口述一下我的见解吧:回调函数,后面两个字是函数,也就是说我们调用的肯定是个函数啦。至于前面回调两个字,我的个人理解是回头来调用。合起来就是。回过头来调用函数。就像上面我写的假线程和假接口一样。我想new 一个mThread。然后执行mThread里面的run方法。但是它里面的run调用的却是接口mRunable的run方法,然而这个方法是没有实现的,你怎么调用是不是。所以上面的Test2代码里new mThread的时候实现了这个接口,写了里面的run方法。最后,mThread里面的run方法回头调用了我们刚刚实现的run,这就是回调。

好了,写了一个多小时了。今天就写到这里了,有点乱。

最后希望各位看客能够有点收获,我知道我还有很多不足之处,也希望大家能给点意见,谢谢。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表