[问题]
我们知道: 在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 = newcountertimer(5);
ct.tostart();
}
}
请再看一例:
定义了方法huhu()
public class testfinal {
//注意不是static final int var
static int var = 10;
public static void huhu() {
(new a() {
public voidtoprint() {
system.out.println( integer.tostring(++var));
}
}).toprint();
}
public static void main(string[] args) {
huhu();
}
}
class a {
public void toprint() {
}
}
输出结果:11
[结论]
呵呵,写到这里 可以有个小结了:在外部类的方法中创建的匿名内部类,可以引用外部类的非final 变量,并修改:)
[其他]
至于,是不是非得是匿名内部类才可以引用或者,对非primitive 类型的数据可否引用,没有深究.
闽公网安备 35060202000074号