谁是 'this' 在匿名 class 实施中?

who is 'this' inside an anonymous class implementation?

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

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

2.If 假设我有以下界面:

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 指的是 class private onInitWebResponseHandleronInitWebResponseHandler 的一部分,而不是直接引用

我们来测试一下:

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

编辑: 添加了 Test.this.s 正如 Angel Koh

所指出的

关于你的第二个问题。 “this”指的是最里面的对象。

结果会是

HelloWorld@6d06d69c helloWorld
1: HelloWorld$VolleyHandler@7852e922 volley
2: HelloWorld@4e25154f anon
3: HelloWorld@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);
         }
     }; 

}