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:排名不分先后.本文的 ...
随机推荐
- 记录 Docker 的学习过程 (网络篇之跨主机互通)
下面从node3上操作node3# docker run -d -p 8500:8500 --name consul progrium/consul -server -bootstrap node3# ...
- [CQOI2007] 余数求和 - 整除分块
\(\sum_{i=1}^n\;k\;mod\;i\) Solution \(\sum_{i=1}^n\;k\;mod\;i\\=\sum_{i=1}^n(k-i\lfloor{\frac{k}{i} ...
- numpy 一些知识
import numpy as np 什么类型的相加,返回的还是什么类型的,所以在累加小类型的数值时会出现问题如下: a=np.array([123,232,221], dtype=np.uint8) ...
- Java自学-Lambda 概念
Java Lambda 表达式概念 假设一个情景: 找出满足条件的Hero 从使用普通方法,匿名类,以及Lambda这几种方式,逐渐的引入Lambda的概念 步骤 1 : 普通方法 使用一个普通方法, ...
- Django | pycharm 提示 unresolved attribute referene 'objects' for class 'xxxx'
objects高亮,提示信息为unresolved attribute referene 'objects' for class 'BookInfo' 当前情况是pycharm没有识别到objects ...
- 移动端安卓IOS对接H5项目遇到的坑
最近做一个H5项目 退出的时候需要调用原生的弹框退出, 之前以为很简单,直接ajax调用后端退出接口即可.后来发现数据拿不到,因为状态用的是cookie存储, 后来想到ajax 传参数请求,后来还是拿 ...
- EF CodeFirst简介、默认约定、数据库初始化策略
CodeFirst 工作流程 创建或修改领域类-->使用数据注解或者Fluent API来配置领域类-->使用自动数据库迁移技术或者基于代码的数据库迁移技术来创建数据库. CodeFirs ...
- 【转】C#路径中获取文件全路径、目录、扩展名、文件名称
C#路径中获取文件全路径.目录.扩展名.文件名称 原文链接:https://www.cnblogs.com/JiYF/p/6879139.html 常用函数 需要引用System.IO 直接可以调 ...
- 如何查看当前工程,已经安装的nuget包?
本文链接:https://blog.csdn.net/Microsoft_Mao/article/details/101161872如果想知道,当前解决方案(solution)里都安装了什么包,这里可 ...
- TCP/IP协议-为什么说TCP是可靠连接
我们平常经常说UDP是不可靠连接,TCP是可靠连接,然而TCP为什么是可靠的呢 1. TCP和UDP的优缺点TCP 缺点: [1] 三次握手四次挥手,传输更多包,浪费一些带宽[2] 为了进行可靠通信, ...