[問題]
我們知道: 在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 類型的數據可否引用,沒有深究.
新聞熱點
疑難解答