java8的Effectively final

本文探讨了Java 8中内部类使用外部类成员变量的变化,特别是对于final修饰符的要求调整。文中提供了两个示例,分别演示了在不同情况下内部类如何引用外部类的成员变量。

参考java官方文档:http://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html#accessing-members-of-an-enclosing-class

在以前的java版本中匿名内部类的参数必须是final的,原因在于保证内部和外部类的数据一致性。因为编译的时候内部类和方法在同一级别上,所以方法中的变量或参数只有为final,内部类才可以引用。然而java8中不加final,也可以通过编译,在以前的版本中是不允许的。

以下例子(编译通过):

public interface Destination {
	int readLabel();
}
public class Parcel9 {
	static int test = 5; 
	public static void main(String[] args) {
		Parcel9 p = new Parcel9();
		Destination d = p.destination(test);
		d.readLabel();
	}
	
	public Destination destination(int dest) {
		return new Destination() {
			private int label = dest;
			
			@Override
			public int readLabel() {
				System.out.println(label);
				return label;
				
			}
		};
	}
}
解释:



以下例子(编译通不过):


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值