网站首页 > java教程 正文
难度
初级
学习时间
30分钟
适合人群
零基础
开发语言
Java
开发环境
- JDK v11
- IntelliJ IDEA v2018.3
提示
本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。
1.闭包
我们先来看Java中闭包的定义:
闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。
接下来通过一个例子来解释上面的定义。
演示:
请定义一个包含闭包的类。
请观察程序运行结果。
代码:
Outer类:
Main类:
结果:
从运行结果来看,程序没有问题。
我们来分析分析该例子,并结合该例子和大家讲讲闭包。
首先,我们先来看看Outer类:
这是一个外部类,因为它里面有内部类。好,停,这里有人估计要问了,为什么是定义内部类和外部类?
我们来看逐句逐句分析闭包定义“闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。”
第一句:“闭包是一个可调用的对象”
结论:闭包是一个对象。
第二句:“它记录了一些信息”
结论:闭包对象里面可能会有状态和行为,状态即字段(变量),行为即方法。
第三句:“这些信息来自于创建它的作用域”
结论:看到作用域三个字,肯定是定义在代码块中了,仅此一家,再无其他。
那么这个代码块也有很多表现形式啊,比如类体、方法体、实例初始化代码块、静态初始化代码块等等。那么究竟是哪个具体的作用域呢?还是都能定义闭包?
我们再来仔细研读第一句话,“闭包是一个可调用的对象”,闭包是对象啊,大哥,所以呢,该作用域里面肯定能定义类,好像这些作用域都能定义闭包,前面我们不是学过局部内部类和匿名内部类嘛,它们就是定义在作用域里面。但是,兄弟姐妹们,“闭包是一个可调用的对象”,闭包不光是一个对象,它还是一个可调用的对象,意味着该对象可以返回出去,提供给其他类使用的。这么看来,只有定义在类体中的内部类符合条件了,所以大家,Java闭包一定发生在内部类。
而我们的内部类不仅包含外部类对象的信息,还自动拥有一个指向此外部类对象的引用,在此作用城内,内部类有权操作所有的成员,包括private成员。
好,花了这么久解释了为什么要定义外部类与内部类,那么接下来就具体看看里面定义了哪些功能和属性。
从代码图中,我们看到外部类里面只定义了一个基础数字属性,待会会跟用户输入的数字做一个加法,然后将结果返回回去。
接着,我们来看内部类里面定义了什么:
从代码图中,我们可以看到内部类里面定义了一个获取用户输入数字跟外部类中基础数字相加的和这样一个功能,功能很简单。
有同学估计就想问了,为什么要这样写?
我们不妨再来看看闭包的定义“闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。”
结合上面的代码,我来给大家一一将代码与定义对应起来。
第一句:“闭包是一个可调用的对象”
该对象指的就是这个内部类:
第二句:“它记录了一些信息”
记录信息,说的是该内部类里面可以定义自己的成员。这里我们的内部类定义了一个方法:
变量和方法都是属于成员。
第三句:“这些信息来自于创建它的作用域”
首先,这里话里面的它指的是内部类,然后替换之后表达就是“这些信息来自于创建内部类的作用域”,请问创建内部类的作用域是谁?那还用说?肯定是外部类啊,于是这句话就变成了“这些信息来自于创建内部类的外部类”,意思很明确了,你会用到外部类中的成员。
该例子中的baseNumber变量。
再说一点,外部类Outer里面的内部类类名Closure是闭包的英文。
外部类Outer看完了,再去看看Main类。
main()方法里面首先创建了外部类Outer对象,那是因为想要内部类对象,就必须先创建外部类对象。然后创建了内部类对象,接着使用内部类getNumber()方法。
到这里,闭包讲解完毕,你学会了吗?如果还有疑问或者是觉得我没有讲解清楚的地方,欢迎大家在评论区留言,我会根据大家的问题再作解答!请大家谅解!谢谢!
总结
- 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。
至此,Java中闭包相关内容讲解先告一段落,更多内容请持续关注。
附:类学习资料
全栈2019”Java第三十九章:构造函数、构造方法、构造器
全栈2019”Java第五十一章:继承与final关键字详解
附:抽象类学习资料
全栈2019”Java第五十八章:多态中方法返回类型可以是子类类型
附:接口学习资料
附:内部类学习资料
“全栈2019”Java第六十八章:外部类访问内部类成员详解
“全栈2019”Java第六十九章:内部类访问外部类成员详解
“全栈2019”Java第七十一章:外部类访问静态内部类成员详解
“全栈2019”Java第七十二章:静态内部类访问外部类成员
“全栈2019”Java第七十三章:外部类里多个静态非静态内部类详解
“全栈2019”Java第七十四章:内部类与静态内部类相互嵌套
“全栈2019”Java第七十六章:静态、非静态内部类访问权限
“全栈2019”Java第七十七章:抽象内部类与抽象静态内部类详解
“全栈2019”Java第七十八章:内部类可以继承其他类吗?
“全栈2019”Java第八十章:外部类是否能实现本类中的接口?
“全栈2019”Java第八十一章:外部类能否访问嵌套接口里的成员?
“全栈2019”Java第八十二章:嵌套接口能否访问外部类中的成员?
“全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)
“全栈2019”Java第八十八章:接口中嵌套接口的应用场景
“全栈2019”Java第九十章:内部类可以向上或向下转型吗?
“全栈2019”Java第九十二章:外部类与内部类成员覆盖详解
“全栈2019”Java第九十三章:内部类应用场景(迭代器设计模式)
“全栈2019”Java第一百一十一章:内部类可以被覆盖吗?
附:匿名内部类学习资料
全栈2019”Java第九十五章:方法中可以定义静态局部内部类吗?
全栈2019”Java第九十七章:在方法中访问局部内部类成员详解
全栈2019”Java第九十八章:局部内部类访问作用域成员详解
“全栈2019”Java第一百章:局部内部类可以实现接口吗?
“全栈2019”Java第一百零一章:局部内部类覆盖作用域内成员详解
“全栈2019”Java第一百零二章:哪些作用域可以声明局部内部类?
“全栈2019”Java第一百零四章:匿名内部类与外部成员互访详解
“全栈2019”Java第一百零五章:匿名内部类覆盖作用域成员详解
“全栈2019”Java第一百零六章:匿名内部类与抽象类接口注意事项
“全栈2019”Java第一百零七章:匿名内部类与构造方法注意事项
“全栈2019”Java第一百零八章:匿名内部类与final关键字
“全栈2019”Java第一百零九章:匿名内部类实现唯一抽象类或接口
“全栈2019”Java第一百一十章:局部内部类与匿名内部类区别详解
答疑
如果大家有问题或想了解更多前沿技术,请在下方留言或评论,我会为大家解答。
上一章
“全栈2019”Java第一百一十一章:内部类可以被覆盖吗?
下一章
“全栈2019”Java第一百一十三章:什么是回调?
学习小组
加入同步学习小组,共同交流与进步。
- 方式一:关注头条号Gorhaf,私信“Java学习小组”。
- 方式二:关注公众号Gorhaf,回复“Java学习小组”。
全栈工程师学习计划
关注我们,加入“全栈工程师学习计划”。
版权声明
原创不易,未经允许不得转载!
猜你喜欢
- 2024-09-19 Java两个Set集合判断是否有交集(java set求并集)
- 2024-09-19 从一道面试题说起:GET 请求能传图片吗?
- 2024-09-19 Java设计模式(二十):职责链模式(java责任链模式的应用场景)
- 2024-09-19 32位和64位的JVM应该用哪个?
- 2024-09-19 Mac下安装 JDK17(mac下安装nvm以及node)
- 2024-09-19 Java Web项目部署(二)——JDK、Tomcat
- 2024-09-19 Java Web项目部署(三)-MySQL8(javaweb连接mysql具体步骤)
- 2024-09-19 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
- 2024-09-19 win7下绿色版mysql-5.7.18winx64如何配置
- 2024-09-19 Java实现终止线程池中正在运行的定时任务
你 发表评论:
欢迎- 最近发表
-
- class版本不兼容错误原因分析(class更新)
- 甲骨文Oracle公司为Java的最新LTS版本做出改进
- 「版本发布」Minecraft Java开发版 1.19.4-pre1 发布
- java svn版本管理工具(svn软件版本管理)
- 我的世界1.8.10钻石在第几层(我的世界1.7.2钻石在哪层)
- Java开发高手必备:在电脑上轻松切换多个JDK版本
- 2022 年 Java 开发报告:Java 8 八年不到,开发者都在用什么?
- 开发java项目,选择哪个版本的JDK比较合适?
- Java版本选型终极指南:8 vs 17 vs 21特性对决!大龄程序员踩坑总结
- POI Excel导入(poi excel导入附件)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)