zoukankan      html  css  js  c++  java
  • Java中的闭包之实例一

    Java中的闭包之实例一

    https://blog.csdn.net/renaissance_joker/article/details/70217167

    闭包(Closure)是一种能被调用对象,它保存了创建它的作用域的信息。 
    Java并不能显式地支持闭包,但对于非静态内部类而言,它不仅记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以直接调用外部类的private成员,因此可以把非静态内部类当成面向对象领域的闭包。 
    通过这种仿闭包的非静态内部类,可以很方便地实现回调功能,回调就是某个方法一旦获得了内部类对象的引用后,就可以在合适时候反过来调用外部类的方法。所谓回调,就是允许客户类通过内部类引用来调用其外部类的方法,这是一种非常灵活的功能。 
      假设有下面的Teachable接口和Programmer基类,它们都提供了一个work方法,这两个方法的方法签名完全相同,但方法功能可能不一样。首先定义一个Teachable接口(也就是教学接口): 
    这里写图片描述 
    然后定义一个Programmer类(也就是程序猿类): 
    这里写图片描述 
      假设现在有一个人,既是一个程序员,也是一个教师。也就是说需要定义一个特殊的类,既需要实现Teachable接口,也需要继承Programmer父类。表面上看起来这没有任何问题,问题是Teachable接口和Programmer父类里包含了相同的work方法,如果采用如下代码来定义一个特殊的TeachableProgrammer类: 
    这里写图片描述 
      显然上面的TeachableProgrammer类只有一个work方法,这个work方法只能进行“教学”,不再可以进行“编程”。但实际需要TeachableProgrammer类里既包含“教学”的work方法,也包含“编程”的work方法。 
      这个时候,可以通过一个仿闭包的内部类来实现这个功能: 
    这里写图片描述 
    这样就实现了即实现了work的讲解也实现了work的编程2个人的功能。 
    Main函数如下: 
    这里写图片描述

  • 相关阅读:
    Python 不同数据类型比较
    计算机外语收集
    d3.js学习-联系力学图
    d3.js学习11
    d3.js学习10
    d3.js学习9
    d3.js学习8
    [springboot jpa] [bug] Could not open JPA EntityManager for transaction
    [spring cloud feign] [bug] 使用对象传输get请求参数
    [ethereum源码分析](5) 创建新账号
  • 原文地址:https://www.cnblogs.com/handsome1013/p/9415411.html
Copyright © 2011-2022 走看看