Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的回调是什么_Java - Fatal编程技术网

java中的回调是什么

java中的回调是什么,java,Java,可能重复: 我已经阅读了维基百科对回调的定义,但我仍然没有理解它。谁能解释一下回调是什么,特别是下面这行 在计算机编程中,回调是对可执行代码或一段可执行代码的引用,作为参数传递给其他代码。这允许较低级别的软件层调用在较高级别层中定义的子例程(或函数) 回调通常用于异步编程,因此您可以创建一个方法来处理来自web服务的响应。当您调用web服务时,您可以将方法传递给它,这样当web服务响应时,它调用的是您告诉它的方法。。。它“回电” 在Java中,这通常可以通过实现接口并传递实现接口的对象(或匿名

可能重复:

我已经阅读了维基百科对回调的定义,但我仍然没有理解它。谁能解释一下回调是什么,特别是下面这行

在计算机编程中,回调是对可执行代码或一段可执行代码的引用,作为参数传递给其他代码。这允许较低级别的软件层调用在较高级别层中定义的子例程(或函数)


回调通常用于异步编程,因此您可以创建一个方法来处理来自web服务的响应。当您调用web服务时,您可以将方法传递给它,这样当web服务响应时,它调用的是您告诉它的方法。。。它“回电”

在Java中,这通常可以通过实现接口并传递实现接口的对象(或匿名内部类)来实现。您经常在事务和线程(如Futures API)中发现这一点


严格地说,
回调函数的概念在Java中并不存在,因为在Java中没有函数,只有方法,不能传递方法,只能传递对象和接口。因此,任何引用该对象或接口的人都可以调用其任何方法,而不仅仅是您希望它们调用的一个方法

然而,这一切都很好,我们经常谈到回调对象和回调接口,当该对象或接口中只有一个方法时,我们甚至可以谈到回调方法甚至回调函数;我们人类往往在不准确的交流中茁壮成长

(事实上,也许最好的方法是只说“回调”,而不加任何限制:这样,你就不可能出错。 见下一句。)

在Java中使用回调函数的一个最著名的例子是调用
ArrayList
对象进行自身排序,并提供一个比较器,它知道如何比较列表中包含的对象


您的代码是高级层,它调用低级层(标准java运行时列表对象),为其提供与(高级)层中的对象的接口。然后,列表将“回调”您的对象以执行其不知道如何执行的部分任务,即比较列表中的元素。因此,在这种情况下,可以将比较器视为回调对象。

在Java中,回调方法主要用于解决“”问题,这与“异步编程”密切相关


尽管回调也被用来模拟作为参数的传递方法,就像在函数式编程语言中所做的那样。

也许举个例子会有所帮助

你的应用程序想从远程计算机下载一个文件,然后写入本地磁盘。远程计算机是拨号调制解调器和卫星链路的另一端。延迟和传输时间将是巨大的,您还有其他事情要做。因此,您有一个将缓冲区写入磁盘的函数/方法。将指向此方法的指针连同远程URI和其他内容一起传递到网络API。这个网络呼叫立即返回,你可以做其他事情。30秒后,来自远程计算机的第一个缓冲区到达网络层。然后,网络层调用您在设置过程中传递的函数,从而将缓冲区写入磁盘-网络层已“回调”。请注意,在本例中,回调将发生在网络层线程上,而不是原始线程上,但这并不重要——缓冲区仍然会写入磁盘

回调最容易用电话系统来描述。函数调用类似于打电话给某人,问她问题,得到答案,然后挂断电话;添加回拨会改变这种类比,这样在问了她一个问题后,你也会给她你的姓名和电话号码,这样她就可以给你回电话,告诉你答案

Paul Jakubik,C++中的回调实现


回调是传递给给定方法的一些代码,以便以后可以调用它

在Java中,一个明显的例子是。您通常不直接使用
比较器
;而是将其传递给稍后调用
比较器的某个代码:

例如:

class CodedString implements Comparable<CodedString> {
    private int code;
    private String text;

    ...

    @Override
    public boolean equals() {
        // member-wise equality
    }

    @Override
    public int hashCode() {
        // member-wise equality 
    }

    @Override
    public boolean compareTo(CodedString cs) {
        // Compare using "code" first, then
        // "text" if both codes are equal.
    }
}

...

public void sortCodedStringsByText(List<CodedString> codedStrings) {
    Comparator<CodedString> comparatorByText = new Comparator<CodedString>() {
        @Override
        public int compare(CodedString cs1, CodedString cs2) {
            // Compare cs1 and cs2 using just the "text" field
        }
    }

    // Here we pass the comparatorByText callback to Collections.sort(...)
    // Collections.sort(...) will then call this callback whenever it
    // needs to compare two items from the list being sorted.
    // As a result, we will get the list sorted by just the "text" field.
    // If we do not pass a callback, Collections.sort will use the default
    // comparison for the class (first by "code", then by "text").
    Collections.sort(codedStrings, comparatorByText);
}
类编码字符串实现了可比较的{
私有整数码;
私有字符串文本;
...
@凌驾
公共布尔等于(){
//成员平等
}
@凌驾
公共int hashCode(){
//成员平等
}
@凌驾
公共布尔比较器(编码字符串cs){
//首先使用“代码”进行比较,然后
//如果两个代码相等,则为“文本”。
}
}
...
公共无效SortCodeStringsByText(列表代码字符串){
比较器comparatorByText=新比较器(){
@凌驾
公共整数比较(编码字符串cs1、编码字符串cs2){
//仅使用“文本”字段比较cs1和cs2
}
}
//这里我们将comparatorByText回调传递给Collections.sort(…)
//然后,每当调用此回调时,Collections.sort(…)将调用此回调
//需要比较正在排序的列表中的两个项目。
//因此,我们将仅按“文本”字段对列表进行排序。
//如果我们不传递回调,Collections.sort将使用默认值
//类的比较(先按“代码”,然后按“文本”)。
Collections.sort(CodedString、comparatorByText);
}

@Pangea实际上,在那篇文章中找到的定义是来自维基百科的,这里的OP要求对维基百科的定义进行澄清。所以,可能它不是重复的。回调通常是作为参数提供的函数。Java中的回调是控制反转(笑话)