我之前問過這個問題,但我沒有得到一個合適的答案。如果非final字段的值可能更改,如何在匿名類類中使用它?
非最終字段如何在匿名類類中使用,如果它們的值可以更改?
class Foo{
private int i;
void bar(){
i = 10
Runnable runnable = new Runnable(){
public void run(){
System.out.println(i); //works fine
}//end method run
}//end Runnable
}//end method bar
}//end class Foo
如果這是一個匿名類內部使用的局部變量必須final
使編譯器內聯匿名類代碼一樣,裏面它們的值:
前:
public class Access1 {
public void f() {
final int i = 3;
Runnable runnable = new Runnable() {
public void run() {
System.out.println(i);
}//end method run
};//end anonymous class
}//end method f
}//end class Access1
後:
public class Access1 {
public Access1() {}//end constructor
public void f() {
Access1$1 access1$1 = new Access1$1(this);
}//end method f
}//end class Access1
而且
class Access1$1 implements Runnable {
Access1$1(Access1 access1) {
this$0 = access1;
}//end constructor
public void run() {
System.out.println(3);
}//end method run
private final Access1 this$0;
}//end class Access1$1
然後如何編譯內嵌非最終字段的值?
編譯器不能內聯不是編譯時間常量的字段。你確定你反編譯了正確的代碼嗎? – Joni
@Joni我沒有內聯上面的字段值。我只是比較內聯的局部變量值和匿名類使用字段的非最終值(我還不知道)的方式。 – Kareem