Java - 闭包
- 概述
- 简单介绍 闭包
1. 聚合关系
概述
- 常见的 类间关系
场景
类 A
- 主要类
- 持有 类B 的实例
- 有点行为, 需要 类 B 的介入
类 B
- 有自己的行为
- A 会在某些时候调用 B 的行为
代码示例
伪代码
class B:
public void method1():
actions; class A:
private B b; public A(B b):
this.b = b; public void m1():
this.b.method1();
代码
- 伪代码有点坑
- 代码的话, 有机会会做补充
2. 换一个角度
概述
- 闭包
闭包
- 可以调用的对象
- 包含了作用域的信息
- 这玩意也不是什么类间关系
- 为啥把它和 聚合 放一块
场景
类 A
- 单一类
- 持有 类B 的实例
类 B
- 是 类A 的属性
- 是 A 的 内部类
- 实现了 接口I
接口I
- 被 B 实现
- 作为 引用对象, 接收 B 类实例
示例
伪代码
interface I:
void method1(); class A: class B implements I:
public void method1():
A.this.method1(); public void method1():
actions public I getCallbackRef():
return new B();
代码
- 有空再补
tips
内部类
- 内部类持有 外部类 的一个引用
- 通过 OuterClass.this 来获取
- 内部类持有 外部类 的一个引用
getCallBackRef
返回一个 I 类型的对象
- 实现方法
- 方便外面接收实例
实际返回的, 是 内部类 的实例
内部类的 method1
来自 I 的实现
实际行为
- 需要靠 A 来执行
然后一个类比
模型
- 类A 持有 类B
- 类A 的行为, 由 类B 来执行
聚合
- 符合这个模型
闭包
- 内部类的角度, 也符合这个模型
- 当然有点别扭
- 别扭的是, 内部类持有了 外部类 的引用
- 其实, 这个也不用奇怪
- 内部类 外部类 的关系, 和 聚合关系, 并没有直接的 可比性
- 当然, 只是相似
- 一个持有另一个
闭包
- 行为
- 得到一个 接口I 类型, 但实际为 内部类 的对象
- 当然, 这个接口, 也可以换成 抽象类
- 这个对象, 持有创建它的外部类
- 可以通过它, 暴露一些外部类的方法, 属性
- 可以通过这个持有, 保持外部类不被垃圾回收
- 得到一个 接口I 类型, 但实际为 内部类 的对象
- 行为
3. 好了, 那闭包到底有什么用
- 多重继承
java 的继承
- 正常情况下, 只能继承一个类
- 接口实现多个, 这个另说
多重继承
也不是真正意义上的多重继承
思路
约定
- 类 Outer
- 外部类
- 类 Inner
- 内部类
- 类 Abs1
- 抽象类1
- 类 Abs2
- 抽象类2
- 类 Outer
场景
- Outer 继承 Abs1
- Inner 继承 Abs2
- Inner 实现 Abs2 方法
- 实现的时候, 可以引入 Outer 对象来做操作
- 虽然不是真正的多重继承, 但实质上已经可以这么认为
- Outer 实现方法, 返回 Abs2 类型的对象
- 实际返回 Inner 类型的实例
- 其他使用者, 用 Abs2 类型的引用, 来接住这个实例
ps
类间关系
- ref
- 关于 依赖 与 聚合
约定
- 类 A
- 主体类
- 类 B
- 被依赖
- 被聚合
- 类 A
依赖
- 重点
- A 的方法, 需要 B 来做参数
- 可能导致的结果, A 的行为, 会受到 B 影响
- A 的方法, 需要 B 来做参数
- 重点
聚合
- 重点
- A 的属性, 是 B
- 可能导致的结果, A 的行为, 会受到 B 影响
- 怎么和上面一样...
- 可能导致的结果, A 的行为, 会受到 B 影响
- A 的属性, 是 B
- 重点
区别
- 依赖
- 强调的关系, 没有聚合那么紧密
- 临时产生一个交集
- 交互完了关系立马消失
- 聚合
- 关系相对紧密, 整体 与 部分 的关系
- 关系较为稳定
- 整体存在, 关系一直都存在
- 依赖
内部类
- 这块暂时不细说
- Java 编程思想里, 有一章专门对这块做了详细的介绍
- 这块暂时不细说
其他
类间关系, UML
- 这块其实, 还是挺有用的
js 闭包
- 我第一见到闭包, 其实是 js
- 但是至今没有理解
伪代码
- 这块最好还是总结下吧
- 伪代码其实是 思路的体现
- 强调重点
- 与具体的语法独立
- 写起来方便
- 可以翻译成其他语言
- 我至今没有学太好
- 第一见到, 是偏向 py 的伪代码
- 但是 java 中的很多东西, py 不好表达
- 第一见到, 是偏向 py 的伪代码
- 所以希望还是能学会这个东西
- 最好有足够强的表达能力
- 希望可以简单易懂
- 翻译起来, 不那么费劲
- 伪代码其实是 思路的体现
- 这块最好还是总结下吧
Java - 闭包的更多相关文章
- java 闭包与回调
闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域. 内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象 ...
- Java闭包和回调
Java中的闭包与回调可以通过成员内部类来实现. 简单的来说闭包就是返回一个内部类对象,这个内部类对象包含了外部类对象的信息(因为一个内部类对象定依托于一个外部类对象). 回调就是在闭包的基础上实现的 ...
- Java闭包概念
闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在. 解释二:闭包是函数和相关 ...
- 深入理解Java闭包概念
闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在. 解释二:闭包是函数和相关 ...
- java闭包
闭包就是在一个外部类A中声明了一个内部类B,然后这个内部类可以访问他自己B的作用域和外部类A的作用域.然后现在用另外一个类C创建了一个内部类B,那么这个内部类B可以访问C的作用域. 如果没有闭包,那B ...
- Java 8怎么了:局部套用vs闭包
[编者按]本文作者为专注于自然语言处理多年的 Pierre-Yves Saumont,Pierre-Yves 著有30多本主讲 Java 软件开发的书籍,自2008开始供职于 Alcatel-Luce ...
- js闭包vs Java内部类
前言: 昨天写了一个关于Java内部的博客,在内部类的最后一点中谈到了Java闭包的概念,他是这样定义闭包的:闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域.结合Java的内部类 ...
- Java牛人
Java领域有很多著名的人物,他们为Java社区编写框架.产品.工具或撰写书籍改变了Java编程的方式.本文是<最受欢迎的8位Java牛人>的2.0版本. PS:排名不分先后.本文的信息整 ...
- 你应当知道的Java牛人
Java领域有非常多著名的人物,他们为Java社区编写框架.产品.工具或撰写书籍改变了Java编程的方式. 本文是<最受欢迎的8位Java牛人>的2.0版本号. PS:排名不分先后.本文的 ...
随机推荐
- Python 之路Day13
匿名函数 一行函数 lambda == def -- 关键字 lambda x:x x 是普通函数的形参(位置,关键字……)可以不接收参数,可以不写 :x 是普通函数的函数值(只能返回一个数据类型), ...
- Unable to create initial connections of pool. spring boot mysql
Unable to create initial connections of pool. 在链接url里添加 将useSSL=true改为useSSL=false 只能说明服务器没有打开SSL功能
- AdaBoost级联分类器
Haar分类器使用AdaBoost算法,但是把它组织为筛选式的级联分类器,每个节点是多个树构成的分类器,且每个节点的正确识别率很高.在任一级计算中,一旦获得“不在类别中”的结论,则计算终止.只有通过分 ...
- [CF1236D] Alice and the Doll - 模拟,STL
[CF1236D] Alice and the Doll Description \(N \times M\)网格,有 \(K\) 个格子里有障碍物.每次经过一个格子的时候只能直走或者右转一次.初态在 ...
- Working copy not locked; this is probably a bug, please report
问题描述 svn: Unable to lock 'G:\chengXu\2017_Year\JFW\Easy7\src' 解决方案
- 集成Log4Net到自己的Unity工程
需要使用的插件库说明: Loxodon Framework Log4NetVersion: 1.0.0© 2016, Clark Yang=============================== ...
- 【Unity|C#】基础篇(0)——C#与.NET框架
[学习资料] <C#图解教程>(第1章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu.c ...
- QImage和IplImage转换总结
在arm中做图像处理,因为不支持GTK,一般都会用到QT来实现显示功能,所以不可避免的要涉及到QImage和IplImage两种图像格式之间的转换,下面总结一下转换的方法. (下面格式转换的代码都是网 ...
- python之路之考试题目
- Java-POJ1011-sticks
很经典的搜索题,直接爆搜会卡在连续相同长度的木棍,可以先排序,预处理该长度不行直接跳下一长度木棍的位置 但此题特殊,木棍长度小于50,我们可以直接桶排序 还有就是关于回溯的理解: 我们写的dfs为的是 ...