1. 程式人生 > >為什麼內部類訪問區域性變數需要加final修飾?

為什麼內部類訪問區域性變數需要加final修飾?

先看一段程式碼:

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修飾之後,此時會在記憶體中保有一份區域性變得的複製品,當內部類訪問的時候其實訪問的是這個複製品。