调用类的接口方法

时间:2017-08-08 07:29:04

标签: java android oop interface

我正在阅读如何实施凌空回调here

以及我们如何在代码中使用它就像这样

JsonObjectRequest jsonrequest = new JsonObjectRequest(Request.Method.GET, url, null, new Response.Listener<JSONObject>() {
       @Override
       public void onResponse(JSONObject jsonObject) {}

那么Response类如何能够访问这样的接口方法呢?新的Response.Listener不应该是这样的吗?

new Response().Listener();

使用响应类的对象进行访问?

这种语法来自哪里,是什么逻辑?

new Response.Listener();

3 个答案:

答案 0 :(得分:1)

您没有实例化Response,而是实例化Listener(匿名),它是Response的内部类(接口)。

new Response().Listener();

是一个实例方法调用,如new Integer(42).equals(42) or new Thread(..).start()

new Response.Listener()

是一个匿名内部类实例化,如new View.OnClickListener(){..},与静态字段/方法访问相同:Boolean.TRUE, Integer.compare(1,2)(您可以将Response视为访问Listener类的路径 - 如果它更容易为你)

答案 1 :(得分:1)

我将从你的上一个问题开始:

  

这种语法来自哪里,逻辑是什么?新   Response.Listener();

这种语法意味着,有一个类Response,其中定义了一个接口或类Listener(嵌套),在您的情况下,它是一个接口,如果你有机会查看Response的源代码,您可能会看到类似这样的内容:

public class Response{
    :
    :
    :

    public interface Listener {
        :
        :
        public void onResponse(JSONObject jsonObject);
    }//Listener interface
}//Response class
  

不应该是这样的吗? new Response()。Listener();

不,您建议的代码意味着,从Response创建一个新实例,然后从该对象调用一个名为Listener()的方法(响应)

虽然此new Response.Listener表示创建在Listener

内定义的Response的新实例

奖金:现在Listener是一个界面,您无法创建它的实例。 所以应该做的是:

1-创建implements Listener并覆盖onResponse()的新课程,并将其作为参数传递给JsonObjectRequest(...)

前,

public class MyListern implements Response.Listener{
    @Override
    public void onResponse(JSONObject jsonObject) {
        //put your implementation here ...
    } 
}//Response class

MyListern mMyListern = new MyListern();
JsonObjectRequest jsonrequest = new JsonObjectRequest(Request.Method.GET, url, null, mMyListern);

OR

2-创建一个匿名内部类,并将其作为参数传递给JsonObjectRequest(...)(这就是你在问题中发布的方式)

- 编辑:额外奖励:) mMyListern是类MyListern的实例,它实现了在Response中定义的Listener,所以它不是Response类,它是MyListener。

如果你说

,你可以将Response.Listener视为一条路径

c:\users\john\Desktop

这是一个指向桌面的路径,存在于john内,而john存在于users中,因此桌面不是用户 < / p>

答案 2 :(得分:1)

它只是一个嵌套类(1)。例如:

public class A {
  ...
  public static class B { ... }
}

A类就像B类的包,所以要创建一个你需要编写的新实例

new A.B();

但实际上该代码实例化了一个扩展内部类的匿名类:

B myB = new A.B() {
  //methods overriden here
};

(1)B也可以是一个界面。在这种情况下,您无法实例化它,因此唯一的选择是创建一个匿名类。我没有读过该Response类的当前实现,所以我不知道Listener是一个类还是一个接口