为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?
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 修饰了) } }
再也不想纠结这个问题了!