爲何局部變量必須以final修飾(或者有final實效:java8)才能夠在內部類中使用?

爲何局部變量必須以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

相關文章
相關標籤/搜索