为什么接口可以用于获取java上的回调?

为什么接口可以用于获取java上的回调?,java,android,oop,android-volley,Java,Android,Oop,Android Volley,我正在使用此代码: public void getString(最终截击回调){ StringRequest strReq=newStringRequest(Request.Method.GET,url,new Response.Listener()){ @凌驾 公共void onResponse(字符串响应){ 结果=响应; callback.onSuccess(结果); } }... }} 公共接口截击回调{ 成功时无效(字符串结果); } 我的问题是,为什么这个接口可以用来监听响应。正如

我正在使用此代码:

public void getString(最终截击回调){
StringRequest strReq=newStringRequest(Request.Method.GET,url,new Response.Listener()){
@凌驾
公共void onResponse(字符串响应){
结果=响应;
callback.onSuccess(结果);
}
}...
}}
公共接口截击回调{
成功时无效(字符串结果);
}
我的问题是,为什么这个接口可以用来监听响应。正如我在java接口中所知道的,是某种契约,或者一些抽象类,它有一些方法。接口需要在我们实际使用它之前实现,但是在上面的代码中没有任何实现代码

但是基于该接口的新对象可以作为侦听器填充。需要一些简洁的解释为什么会出现这个概念


感谢您的解释。

调用
getString()
函数时,您需要传入接口的实际实现。

接口(
Response.Listener
)在此处作为匿名类实例实现:

....
new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        result=response;
        callback.onSuccess(result);
    }
}
....
。。。。
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
结果=响应;
callback.onSuccess(结果);
}
}
....
这相当于创建一个实现
Response.Listener
的类,然后将该类的一个实例传递给
StringRequest
构造函数。

这称为或其变体,其中您正在实例化遵守该接口约定的新对象,并将其引用传递给调用方,因此它可以在完成它正在做的任何事情时使用该对象。之所以使用它,是因为在一个匿名类中为这么小的任务定义您的行为是很实际的

如果回调中有很多重复的行为,还可以创建一个实现回调接口的具体类,并将其实例传递给调用方。

它也是一个视图:-


Java的面向对象模型目前不支持方法指针,因此似乎排除了使用这种舒适的机制。Java对接口的支持提供了一种机制,我们可以通过这种机制来获得方法指针。

思想与这里相同

public class Button {
    private Callback callback;

    public Button(Callback callback) {
        this.callback = callback;
    }

    public void update() {
        // Check if clicked..
        callback.onClick(this);
    }

    public interface Callback {
        public void onClick(Button Button);
    }
}


Button b = new Button(new Callback() {
    @Override
    public void onClick(Button b) {
        System.out.println("Clicked");
    }
});
在您的情况下,
StringRequest
需要实现方法
onResponse
的对象。稍后将调用此方法,并执行代码体



当您发送一个对象时,实际上是向它发送了一个引用。调用者希望能够调用一些方法(它希望您实现一些接口).

它在对象和子对象之间,而不是接口和object@JonnyHenly您编辑您的答案,先生:D….它需要更多的细节…如果您只接受问题/答案代码的一部分,请不要在这里抱怨….请仔细阅读其中的说明:活动中的代码:
new-VolleyCallback(){@Override public void onSuccess(String result){
我在发布问题时添加了链接..我认为没有copas其他代码,这些代码就足够清晰了。新的
Response.Listener()在哪里{代码。我从来没有在我的代码中键入过它…@navotera你没有键入它是什么意思?我从你的问题中复制了那段代码。它在
StringRequest
构造函数的调用中。对不起,先生…我没有看到它…投票1否决投票接受接口(Response.Listener)这里是作为匿名类实例实现的抱歉先生Response.listerner和interface VolleyCallback之间的联系是什么?你是说Response listerner实际上推动了这个接口吗?@navotera从你的问题中不清楚你问的是哪个接口。显然,任何调用
getString
me的地方thod必须向它传递一个类的实例,该类实现了
VolleyCallback
接口。接口从未实现,但我在某些活动中通过新的volley创建了。那么您是如何调用getString()的呢?类EventSource扩展了Observable..但这是接口..对不起,im新手是一样的吗?这是同一个概念,但这个概念在Android SDK和Java中的很多类中都被广泛使用,所以不要被它的名称所愚弄,它不是你需要的。它不是接口类…如果我认为我们需要在actu之前实现接口的话ally使用它自己的接口方法我使用接口回调,在您的情况下,在java代码中实现接口时是这样的,不总是需要
implement
关键字?当它不使用时,这样的接口将被使用implement关键字谢谢Sir简短的回答是的。检查有关的信息。@Jonny Henly指出阅读关于接口和在class
public class CallMe
的实际使用中,它需要实现接口,但在我上面的代码中没有任何实现关键字cmiw
public class Button {
    private Callback callback;

    public Button(Callback callback) {
        this.callback = callback;
    }

    public void update() {
        // Check if clicked..
        callback.onClick(this);
    }

    public interface Callback {
        public void onClick(Button Button);
    }
}


Button b = new Button(new Callback() {
    @Override
    public void onClick(Button b) {
        System.out.println("Clicked");
    }
});