关于 final 的奇怪问题
2008-01-05 18:33:02 来源:WEB开发网[问题]
我们知道: 在java 中,若内部类需要引用外部类的变量,则外部类的变量必须定义为final类型的.但在编码中,偶
尔发现在方法中的匿名内部类里就是可以访问外部类的非 final 变量,并且改变其值.
[代码分析]
让我们看看代码,代码中注重外部类CounterTimer 中的非final类型 int times,可以在CounterTimer类的方
法 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 变量,并修改:)
[其他]
至于,是不是非得是匿名内部类才可以引用或者,对非primitive 类型的数据可否引用,没有深究.
更多精彩
赞助商链接