繁体   English   中英

谁是匿名 class 实现中的“这个”?

[英]who is 'this' inside an anonymous class implementation?

我无法弄清楚在匿名 class方法中引用的 object 是什么。 两个例子:

  1. 如果我为 onClick 实现匿名实现,例如:
View.setOnClickListener(new View.onClick() {
    public void onClick(View v) {
        ...
        this.   //to which object this refers?
   }
}

2.假设我有以下界面:

interface  WebResponseHandler {
    public void onWebResponseFinished(String jsonString)
}

在一些 class 内部,我定义了一个实现上述接口的变量:

private onInitWebResponseHandler = new VolleyHandler.WebResponseHandler() {
    public void onWebResponseFinished(String jsonString) {
            .....
            this    // to which object this refers to?
    }
}

我很惊讶在第二个示例中this指的是私有 onInitWebResponseHandler 所属的 class 而不是直接指onInitWebResponseHandler

让我们测试一下:

public class Test {

    private String s = "Test Class";

    public void myMethod() {

        System.out.println("this.s: " + this.s);

        new Callable<String>() {
            private String s = "Callable Class";

            @Override
            public String call() {
                System.out.println("this.s: " + this.s);
                System.out.println("Test.this.s: " + Test.this.s);
                return null;
            }
        }.call();
    }


    public static void main(String[] args) {
        new Test().myMethod();
    }
}

它打印

this.s: Test Class
this.s: Callable Class
Test.this.s: Test Class

所以匿名 class 中的this是匿名 class

编辑:Angel Koh所指出的,添加了Test.this.s

关于你的第二个问题。 “这个”是指最里面的object。

结果将是

HelloWorld@6d06d69c helloWorld
1: HelloWorld$VolleyHandler@7852e922 volley
2: HelloWorld$1@4e25154f anon
3: HelloWorld$2@70dea4e anon2

对于以下代码

public class HelloWorld{
    

     String s="helloWorld";
     public static void main(String []args){
         
         HelloWorld hw = new HelloWorld();
         hw.run();
         hw.onInitWebResponseHandler1.onWebResponseFinished("1");
         hw.onInitWebResponseHandler2.onWebResponseFinished("2");
          
         hw.onInitWebResponseHandler3.onWebResponseFinished("3");
          
        
     }
    
     public void run(){
         System.out.println(this.toString()+" "+s);
         
         
     }
     
     interface WebResposeHandler {
         public void onWebResponseFinished(String jsonString);
     }   
     
      

    class VolleyHandler implements  WebResposeHandler {
         String s="volley";
         public void onWebResponseFinished(String jsonString){
             System.out.println("1: "+this.toString() +" "+ this.s);
         }
     }  
     
     WebResposeHandler onInitWebResponseHandler1 = new VolleyHandler();
     WebResposeHandler onInitWebResponseHandler2 = new WebResposeHandler(){
         String s="anon";
         public void onWebResponseFinished(String jsonString){
             System.out.println("2: "+this.toString() +" "+ this.s);
         }
     }; 
     WebResposeHandler onInitWebResponseHandler3= new WebResposeHandler(){
         String s="anon2";
         public void onWebResponseFinished(String jsonString){
             System.out.println("3: "+this.toString() +" "+ this.s);
         }
     }; 

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM