java8的Effectively final

原创 2016年04月16日 21:40:05

参考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;
				
			}
		};
	}
}
解释:



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


函数式编程--lambda表达式对比匿名内部类

从前面的整理中我们看出了,Lambda表达式其实是匿名内部类的一种简化,因此它可以部分取代匿名内部类。 1,Lambda表达式与匿名内部类存在如下相同点: 1),Lambda表达式与匿名内...
  • u011794238
  • u011794238
  • 2015年10月27日 16:00
  • 2590

java基础学习——final,static,const在使用上有什么区别

JAVA中——final、static final: final修饰类:该类不可继承 final修饰方法:该方法不能被子类覆盖(但它不能修饰构造函数) final修饰字段属性:属性值第一次初始化后不...
  • yiziweiyang
  • yiziweiyang
  • 2016年08月25日 19:04
  • 2050

为什么必须是final的呢?

一个谜团 如果你用过类似guava这种“伪函数式编程”风格的library的话,那下面这种风格的代码对你来说应该不陌生: 1 2 3 4 5 6 7 8 9 ...
  • cuipengfei1
  • cuipengfei1
  • 2013年06月23日 00:57
  • 8241

Java8增加功能--Effectively final 功能

java8新增了很多功能,可以大大简化代码,这个系列将会一一辅助代码加以介绍。 局部内部类和匿名内部类访问的局部变量必须由final修饰,java8开始,可以不加final修饰符,由...
  • sinat_26342009
  • sinat_26342009
  • 2015年04月16日 17:00
  • 3220

Java8---隐示final

捕获和非捕获的Lambda表达式 当Lambda表达式访问一个定义在Lambda表达式体外的非静态变量或者对象时,这个Lambda表达式称为“捕获的”。比如,下面这个lambda表达式捕捉了变量x: ...
  • u012813201
  • u012813201
  • 2017年04月05日 13:30
  • 91

Java基础8---面向对象代码块和继承和this和super和重写和重载和final

一、代码块      在Java中,使用{}括起来的代码被称为代码块。根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块。 局部代码块 在方法中出现;限定变量生命周期,...
  • u010941185
  • u010941185
  • 2016年06月05日 23:00
  • 268

Thinking in Java(8)-final keyword

1.final data The following example shows the basic rules of final keyword:import java.util.*;class ...
  • qq_23851075
  • qq_23851075
  • 2016年11月06日 20:47
  • 121

JAVA菜鸟入门(8) Java的Final关键字

java final 和C++的const功能类似,用来表达常量,还能用在class或者method上,提供不同的用法。 1. Java Final Variable  Once ...
  • feliciafay
  • feliciafay
  • 2015年04月26日 00:32
  • 723

Java中的final参数/变量+匿名内部类的字节码分析,以及Java 8中的使用

在Java 8之前一个常识就是如果要在方法中定义一个匿名内部类并使用该方法内的局部变量(包括参数),需要使用final关键字修饰。网上也有很多对这种机制的解释和说明,但是大部分都是一种抽象的认识。如果...
  • Zerohuan
  • Zerohuan
  • 2015年11月27日 20:53
  • 1758

DedeCmsV5.7-UTF8-Final

  • 2011年10月30日 15:21
  • 5.22MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java8的Effectively final
举报原因:
原因补充:

(最多只允许输入30个字)