java中的闭包

一、什么是闭包

百度百科的定义为:
闭包就是能够读取其他函数内部变量的函数。
例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。

MDN中给出闭包的如下定义:
一个函数和对其周围状态(lexical environment,词法环境)的引用捆绑在一起(或者说函数被引用包围),这样的组合就是闭包(closure)。

网上较多的闭包定义:
-当函数可以记住并访问所在的词法作用域,并且保持着对词法作用域的引用,即使函数是在当前作用域之外执行,就会形成闭包。
词法作用域:函数在执行的过程中,先从自己的内部作用域找变量;在自己的内部没有找到的话,就到这个函数声明所在的作用域(即词法作用域)里面去找,依次向上。(最后也没有找到的话就是undefined或报错)

我的理解:
一个函数或者方法存在自由变量,就会形成闭包。
(1)自由变量即是没有在该方法中定义过但是却可以使用的方法。java中的变量有成员变量,局部变量,类变量。
(2)其中本类中的成员变量不属于自由变量,应为每个方法其实参数中都有一个this指针。当前方法的局部变量也不属于自由变量。类变量属于全局变量有的说法是属于自由变量也有说不属于。
(3)综上所述,其他方法中的局部变量和其他类的成员变量属于自由变量。如果在当前方法中使用到了,那么当前方法就可以形成闭包。
形成闭包的函数需要在外部可以访问,才有意义。

二、java中的闭包

但是在java中并没有函数这个概念,只有成员方法。
在方法内部可以定义方法的局部变量。我们无法在方法内部定义方法,但是可以通过内部类、匿名内部类和lamdba表达式来实现闭包:
内部类:

package com.wrh.innerdemo;

public class InnerDemo01 {
    class Bar{
        public void show(){
            //do ..
        }
    }
    public static void main(String[] args) {
        InnerDemo01 innerDemo01=new InnerDemo01();
        Bar bar=innerDemo01.method();
        bar.show();//你觉得num会输出吗????
    }
    public Bar  method(){
        //String str="wuranghao";
        int num=30;
        //局部内部类将输出这个局部变量
        class innerClass extends Bar{

            public void show(){
                System.out.println(num);
            }
        }
        return new innerClass();
    }

}

匿名内部类:

public class Hello {
    public static void main(String[] args) {
        int i = 0;
        Supplier<Integer> sup = new Supplier<>(){
            Integer get(){
                return i;
            }
        };
    }
}

需要注意的是,方法中的i其实是final变量,也就是无法修改。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值