转自:林信良http://caterpillar.onlyfun.net/Gossip/JavaGossip-V1/InnerClass.htm
注意如果要在內部匿名类中使用某个方法中的变量,该变量必须被申明为final,否则无法通过编译:
....
public void someMethod() {
int x = 10;
public void someMethod() {
int x = 10;
^必须为fianl
Object obj = new Object() {
public String toString() {
return "" + x;
}
};
System.out.println(obj.toString());
}
编译器报错:
Object obj = new Object() {
public String toString() {
return "" + x;
}
};
System.out.println(obj.toString());
}
编译器报错:
local variable x is accessed from within inner class; needs to be declared final
原因在于,变量X并不是真正被乃来给内部匿名类使用,而是在内部匿名类中复制一份,作为field成员来使用,由于是复本,即使在内部类中对x做了修改,也不会影响真正的本地变量x。