為什麼內部類訪問區域性變數需要加final修飾?
阿新 • • 發佈:2019-01-05
先看一段程式碼:
public void myRun(final String name){
new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name);
}
}.start();
}
這是一個非常簡單的執行執行緒的函式。
再來看,內部類的生命週期和方法體的生命週期並不相同,如果區域性變數不是final型別會出現在這樣一個問題。該方法體在1秒內執行完畢,即銷燬name變數,那1秒後執行的內部類方法則取不到name變量了。
而區域性變數被final修飾之後,此時會在記憶體中保有一份區域性變得的複製品,當內部類訪問的時候其實訪問的是這個複製品。