谁是 'this' 在匿名 class 实施中?
who is 'this' inside an anonymous class implementation?
我无法弄清楚 this 在匿名 class 方法中引用的对象是什么。
两个例子:
- 如果我为 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 onInitWebResponseHandler 是 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
编辑: 添加了 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);
}
};
}
我无法弄清楚 this 在匿名 class 方法中引用的对象是什么。 两个例子:
- 如果我为 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 onInitWebResponseHandler 是 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
编辑: 添加了 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);
}
};
}