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:排名不分先后.本文的 ...
随机推荐
- C++——动态内存分配1
9.动态内存分配 new 类型名T(初值列表) 其功能是在程序执行期间申请用于存放T类型对象的内存空间,并依初值列表赋以初值,结果值:成功则T类型的指针,指向新分配的内存:失败则为0(null).若 ...
- AntDesign(React)学习-5 路由及使用Layout布局
前言:学习目标实现点击登录按钮,直接进入后台布局页面,类似下面antd官网文档展示效果 ant.design访问 https://ant-design.gitee.io/components/menu ...
- 如来十三掌-关于不断解密的密码学,佛语解密,rot-13(根据13掌),base64
得到MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9 然后尝试嘛 base64不太行 那根据十三掌??rot-13 得到ZmxhZ3tiZHNj ...
- Web 开发人员推荐的通用独立 UI 组件
现代 Web 开发在将体验和功能做到极致的同时,对于美观的追求也越来越高.在推荐完图形库之后,再来推荐一些精品的独立 UI 组件.这些组件可组合在一起,形成美观而交互强大的 Web UI . 给 We ...
- rest_framework:版本控制
一.作用: 用于版本的控制,区分不同的功能,对于一些新增功能的添加更新就会在新的版本中体现,有点类似于,新版本就是软件发布的新版本,和老版本相比新增或者修改了一些功能 二.内置的版本控制类: from ...
- yii2验证规则
验证规则 1.内置验证规则 [['sex', 'partner_id'], 'integer'], [['partner_id', 'camp_id',], 'required'], [['creat ...
- Binary Number(位运算)
#include<bits/stdc++.h> using namespace std; int n; int getBits1(int n)//求取一个数的二进制形式中1的个数. { i ...
- ubuntu安装搜狗输入
百度搜索搜狗输入ubuntu找到官网地址 下载deb包 sogoupinyin_2.3.1.0112_amd64.deb 上传 dkpkg -i sogoupinyin_2.3.1.0112_a ...
- Java对象构成所有Java应用程序的基础
通过在优锐课的ange交流下,掌握了很多编程思想方法 特来分享 对象具有状态和行为 Java中的对象以及其他任何``面向对象''语言都是所有Java应用程序的基本组成部分,代表了你可能在你周围找到的任 ...
- 解决windows配置visual studio code调试golang环境问题
写这篇随笔是为了Mark下在这个过程中配到的几个问题 1.具体过程可参考https://www.cnblogs.com/JerryNo1/p/5412864.html,Jerry博主写的非常详细了 1 ...