标签:enc 绑定 nas 提升 内部函数 vacl 多少 返回 一个
原文地址:https://sylvanassun.github.io/2017/07/30/2017-07-30-JavaClosure/
1.自由变量:
function Add(y) { return function(x) { return x + y; } }
对于内部函数function(x)
来说,y
就是自由变量
.而y
是函数Add(y)
内的参数,所以Add(y)
对内部函数function(x)
形成了一个闭包.
Java
与JavaScript
又或者其他支持闭包的语言不同,它是一个基于类的面向对象语言,也就是说一个方法所用到的自由变量
永远都来自于其所在类的实例的.
class AddUtils { private int y = 5; public int add(int x) { retrun x + y; } }
这样一个方法add(x)
拥有一个参数x
与一个自由变量y
,它的返回值也依赖于这个自由变量y
.add(x)
想要正常工作的话,就必须依赖于AddUtils
类的一个实例,不然它无法知道自由变量y
的值是多少,也就是自由变量
未与add(x)
进行绑定.
2.严格上来说,add(x)
中的自由变量
应该为this
,这是因为y
也是通过this
关键字来访问的.
3.Java 中的捕获策略是按值捕获
Java
的匿名内部类和Java 8
新的lambda
表达式都是这样实现的.C#
的匿名函数(匿名委托/lambda表达式)就是这样实现的.
4.匿名内部类是 java中闭包的体现
public interface AnonInner() { int add(); } public class Outer { public AnonInner getAnonInner(final int x) { final int y = 5; return new AnonInner() { public int add() { return x + y; } } } }
getAnonInner(x)
方法返回了一个匿名内部类AnonInner
,匿名内部类不能显式地声明构造函数,也不能对构造函数传参,且返回的是一个AnonInner
接口,但它的add()
方法实现中用到了两个自由变量
(x
与y
),也就是说外部方法getAnonInner(x)
对这个匿名内部类构成了闭包.
标签:enc 绑定 nas 提升 内部函数 vacl 多少 返回 一个
原文地址:http://www.cnblogs.com/lemos/p/7617865.html