java8的Effectively 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;
				
			}
		};
	}
}
解释:

java8的Effectively final_第1张图片

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

java8的Effectively final_第2张图片

你可能感兴趣的:(final,Effectively)