zoukankan      html  css  js  c++  java
  • Java闭包

    对闭包的不同定义:

    1.这个函数通常被定义在另一个外部函数中,并且引用了外部函数的中的变量。

    2.闭包是一种能被调用的对象,它保存了创建它的作用域的信息。

    3.将当前上下文中的变量代入定义的匿名方法中。匿名方法中定义的变量,在外部看不到。这种单向的包含关系叫闭包。

    4.闭包是可以包含自由变量的代码块,自由变量不在这个代码块或任何全局上下文中定义,而是在定义代码块的环境中定义。

    闭包的价值在于可以作为函数对象或匿名函数,支持闭包的语言都可以将函数赋值给变量,作为参数或返回值。

    JavaScript中的闭包例子:

    函数a中定义函数b并返回,外部函数c获取函数b并调用。由于函数a中的变量i可以被外部函数引用,所以一直不释放。

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

    Java语言本身并没有实现闭包,但可以用匿名的内部类来模拟闭包。

    闭包的作用就是简化了主程序和匿名函数之间变量交换,参数传递的过程,不需要额外定义变量,直接传。容易导致变量得不到释放,因为闭包函数会延长变量的生命周期。

    Java使用闭包的场景:

    假设有下面的Teacher接口和Programmer类,都提供了work方法,但方法功能不一样。

    public interface Teacher{
        void work();
    }
    public class Programer{
    
        private String name;
    
        public Programer() {}
    
        public Programer(String name) {this.name=name;}
    
        public String getName(){return name;}
    
        public void setName(String name){this.name=name;}
    
        public void wrok() {System.out.println(name+"在干xxx");
    }

    张三,即使程序员又是教师。也就是需要定义一个类,实现Teacher接口,也需要继承Programmer父类。但问题是都包含了work方法。

    通过一个闭包的内部累来实现这个功能:

    public class TeacherProgramer extends Programer{
    
        public TeacherProgramer(){}
    
        public TeacherProgramer(String name){super(name);}
    
        public class Closure implements Teacher{
    
            public void work() {name+"hello word"}
    
        }
    
        public Teacher getCallBack() (return new Closure();}
    }
    
    
    public static void main(String[] args){
    
        TeacherProgramer teacherProgramer=new TeacherProgramer("法外狂徒张三");
    
        teacherProgramer.work();
    
        teacherProgramer.getCallback().work();
    
    }

    自由变量:

    在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明),对于A作用域来说,x就是一个自由变量。

    var x=10;
    function fn() {
      var b=20;
      console.log(x+b);
    }
  • 相关阅读:
    iter方法读取文件的例子
    Python的datetime与Decimal数据进行json序列化的简单说明
    路由分发时名称空间的2种写法
    “投票练习”笔记
    基于DRF的图书增删改查练习
    【转】很实用的编程英语词库,共收录一千五百余条词汇
    Django的media配置与富文本编辑器使用的实例
    利用Git版本控制管理你的项目
    docker学习与应用
    SharePoint 2010 以Jquery Ajax方式更新SharePoint列表数据!
  • 原文地址:https://www.cnblogs.com/DreamFather/p/15234718.html
Copyright © 2011-2022 走看看