java的闭包

2020-07-06  本文已影响0人  船_长

什么是闭包

1、一个含有自由变量的函数;
2、这些自由变量所在的环境。
也就是函数和环境的总和构成一个闭包。外部环境持有内部函数所使用的自由变量,对内部函数形成“闭包”。
简单但不严格的说,一个函数的“自由变量”就是既不是参数也不是局部变量的变量(外部变量)。

一个纯粹(无副作用)的函数如果不含有自由变量,那么每次用相同的参数调用后的得到的结果肯定是一样的。但如果一个函数含有自由变量,那么调用返回的结果不但依赖于参数的值,还依赖于自由变量的值。因此一个含有自由变量的函数要正确执行,必须保证其所依赖的外围环境的存在。
在JS中的样子如下

function a() { 
  var i = 0; 
  function b() { alert(++i); } 
  return b; 
} 
var c = a(); 
c();      //1 
c();      //2 

闭包和面向对象

闭包与对象是从两个完全不同的角度描述了一件事情:一段代码与其环境的关系。
所以可以用对象来模拟(实现)闭包,也可以用闭包来模拟(实现)对象。
刚刚闭包里的例子的效果完全可以用对象做出来, 这两种方式都体现了函数和环境之间的关系。

class a {  
    private int i = 0;  
    int b( ) { System.out.priintly(++i); }  
}  
a c = new a();
c.b //1
c.b //2

当然严格来说方法所捕获的自由变量不是i,而是this;i是通过this来访问到的,完整写出应该是this.i。

闭包的传值

让我们考察下面两种情况:

如果变量(variable)是不可变(immutable)的,那么使用者无法感知值捕获和引用捕获的区别。

public class Test {
    public static void main(String[] args)  {
         
    }
     
    public void test(final int b) {
        final int a = 10;
        new Thread(){
            public void run() {
                System.out.println(a);
                System.out.println(b);
            };
        }.start();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读