为什么局部变量必须以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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值