为什么局部变量必须以final修饰(或者有final实效:java8)才可以在内部类中使用?

为什么局部变量必须以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 修饰了)
	}

}

 再也不想纠结这个问题了! 

原文地址:https://www.cnblogs.com/liaolongjun/p/6758092.html