爲何局部變量必須以final修飾(或者有final實效:java8)才能夠在內部類中使用?java
public class Ace { public static void main(String[] args) throws Exception { go1(); go2(); // 這個編譯不能經過,運行不了,詳情看下面的說明 } static void go1() { final int n = 5; new Ace() { void go() { test(n); // 並不會改變 n 的值 } void test(int n) { n = 10; } }.go(); System.out.println(n); // 輸出 5 } static void go2() { int n = 5; new Ace() { void go() { n = 10; // 這裏咱們假設不須要 final 修飾,假設這麼寫不報錯 // (實際是報錯了,Java8 能夠不 final 修飾,但這麼寫也會報錯) } }.go(); System.out.println(n); // 若是上面不報錯的話,這裏是否是應該輸出 10 呢?答案是不會。 // 可是,這麼寫,會讓人很天然的覺得 n 的值已經變成 10 了。 // 而實際上,n 的值在內部類中變化,在外面是不會變的 // 爲了讓玩家避免犯「很天然」的錯誤,乾脆強制要 final 修飾得了 // (讓你在內部類中不能改變它,也就不會有上面很天然的錯誤了) // (Java8 中不須要 final 修飾,可是在內部類中改變時會報錯,等因而在進入內部類後,默認 final 修飾了) } }
不再想糾結這個問題了! blog