java 漏洞? 关于final 和 method anonymous class
[问题]
呵呵,不知道为什么,在方法中的匿名内部类里就是可以
访问外部类的非 final 变量,并且改变其值.
这其中有什么奥妙么?
[分析]
让我们看看代码,代码中注意 times 并不是final类型,
但是在方法toStart中的匿名内部类引用并修改了他的值。
代码功能:间隔2秒输出一个累次减小的数字,待到
数字减为0,程序退出。
- — — — — — — — — — — — — — — — — — — — — — — —
import java.util.Timer;
import java.util.TimerTask;
public class CounterTimer {
//减少次数
private int times;
private Timer timer;
public CounterTimer(int times) {
this.times = times;
timer = new Timer();
}
public void toStart() {
//匿名内部类
timer.schedule(new TimerTask(){
public void run() {
if(times > 0)
System.out.println(times — );
else
toStop();
}
},0,2000);
}
public void toStop() {
timer.cancel();
}
public static void main(String args[]){
CounterTimer ct = new CounterTimer(5);
ct.toStart();
}
}
- — — — — — — — — — — — — — — — — — — —
请再看一例:
定义了方法huhu()
- — — — — — — — — — — — — — — — — — — —
public class TestFinal {
//注意不是static final int var
static int var = 10;
public static void huhu() {
(new A() {
public void toPrint() {
System.out.println( Integer.toString(++var));
}
}).toPrint();
}
public static void main(String[] args) {
huhu();
}
}
class A {
public void toPrint() {
}
}
- — — — — — — — — — — — — — — — — —
输出结果:11
- — — — — — — — — — — — — — — — — —
[结论]
呵呵,写到这里 可以有个小结了:
在外部类的方法中创建的匿名内部类,可以引用
外部类的非final 变量,并修改:)
[验证]
莫非真的是可以么? 我又这样测试了一下:
注意在TestFinal2中,把huhu()的代码移到了
main()方法内。
- — — — — — — — — — — — — — — — — — –
public class TestFinal2 {
public static void main(String[] args) {
int var = 10;
//匿名内部类
(new A() {
public void toPrint() {
System.out.println(++var); //报错~~
}
}).toPrint();
}
}
class A {
public void toPrint(int var) {
}
}
- — — — — — — — — — — — — — — — — — — — — –