快捷搜索:  汽车  科技

java包结构的规范性知识(Java第一百一十二章)

java包结构的规范性知识(Java第一百一十二章)演示:接下来通过一个例子来解释上面的定义。本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。我们先来看Java中闭包的定义:闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。

难度

初级

学习时间

30分钟

适合人群

零基础

开发语言

Java

开发环境
  • JDK v11
  • IntelliJ IDEA v2018.3
提示

本教学属于系列教学,内容具有连贯性,本章使用到的内容之前教学中都有详细讲解。

1.闭包

我们先来看Java中闭包的定义:

闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。

接下来通过一个例子来解释上面的定义。

演示:

请定义一个包含闭包的类。

请观察程序运行结果。

代码:

Outer类:

java包结构的规范性知识(Java第一百一十二章)(1)

Main类:

java包结构的规范性知识(Java第一百一十二章)(2)

结果:

java包结构的规范性知识(Java第一百一十二章)(3)

从运行结果来看,程序没有问题。

我们来分析分析该例子,并结合该例子和大家讲讲闭包。

首先,我们先来看看Outer类:

java包结构的规范性知识(Java第一百一十二章)(4)

这是一个外部类,因为它里面有内部类。好,停,这里有人估计要问了,为什么是定义内部类和外部类?

我们来看逐句逐句分析闭包定义“闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。”

第一句:“闭包是一个可调用的对象”

结论:闭包是一个对象。

第二句:“它记录了一些信息”

结论:闭包对象里面可能会有状态和行为,状态即字段(变量),行为即方法。

第三句:“这些信息来自于创建它的作用域”

结论:看到作用域三个字,肯定是定义在代码块中了,仅此一家,再无其他。

那么这个代码块也有很多表现形式啊,比如类体、方法体、实例初始化代码块、静态初始化代码块等等。那么究竟是哪个具体的作用域呢?还是都能定义闭包?

我们再来仔细研读第一句话,“闭包是一个可调用的对象”,闭包是对象啊,大哥,所以呢,该作用域里面肯定能定义类,好像这些作用域都能定义闭包,前面我们不是学过局部内部类和匿名内部类嘛,它们就是定义在作用域里面。但是,兄弟姐妹们,“闭包是一个可调用的对象”,闭包不光是一个对象,它还是一个可调用的对象,意味着该对象可以返回出去,提供给其他类使用的。这么看来,只有定义在类体中的内部类符合条件了,所以大家,Java闭包一定发生在内部类。

而我们的内部类不仅包含外部类对象的信息,还自动拥有一个指向此外部类对象的引用,在此作用城内,内部类有权操作所有的成员,包括private成员。

好,花了这么久解释了为什么要定义外部类与内部类,那么接下来就具体看看里面定义了哪些功能和属性。

java包结构的规范性知识(Java第一百一十二章)(5)

从代码图中,我们看到外部类里面只定义了一个基础数字属性,待会会跟用户输入的数字做一个加法,然后将结果返回回去。

接着,我们来看内部类里面定义了什么:

java包结构的规范性知识(Java第一百一十二章)(6)

从代码图中,我们可以看到内部类里面定义了一个获取用户输入数字跟外部类中基础数字相加的和这样一个功能,功能很简单。

有同学估计就想问了,为什么要这样写?

我们不妨再来看看闭包的定义“闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。

结合上面的代码,我来给大家一一将代码与定义对应起来。

第一句:“闭包是一个可调用的对象”

该对象指的就是这个内部类:

java包结构的规范性知识(Java第一百一十二章)(7)

第二句:“它记录了一些信息”

记录信息,说的是该内部类里面可以定义自己的成员。这里我们的内部类定义了一个方法:

java包结构的规范性知识(Java第一百一十二章)(8)

变量和方法都是属于成员。

第三句:“这些信息来自于创建它的作用域”

首先,这里话里面的它指的是内部类,然后替换之后表达就是“这些信息来自于创建内部类的作用域”,请问创建内部类的作用域是谁?那还用说?肯定是外部类啊,于是这句话就变成了“这些信息来自于创建内部类的外部类”,意思很明确了,你会用到外部类中的成员。

java包结构的规范性知识(Java第一百一十二章)(9)

该例子中的baseNumber变量。

再说一点,外部类Outer里面的内部类类名Closure是闭包的英文。

外部类Outer看完了,再去看看Main类。

java包结构的规范性知识(Java第一百一十二章)(10)

main()方法里面首先创建了外部类Outer对象,那是因为想要内部类对象,就必须先创建外部类对象。然后创建了内部类对象,接着使用内部类getNumber()方法。

到这里,闭包讲解完毕,你学会了吗?如果还有疑问或者是觉得我没有讲解清楚的地方,欢迎大家在评论区留言,我会根据大家的问题再作解答!请大家谅解!谢谢!

总结
  • 闭包是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域。

至此,Java中闭包相关内容讲解先告一段落,更多内容请持续关注。

附:类学习资料

全栈2019”Java第三十六章:类

全栈2019”Java第三十七章:类与字段

全栈2019”Java第三十八章:类与方法

全栈2019”Java第三十九章:构造函数、构造方法、构造器

全栈2019”Java第四十章:this关键字

全栈2019”Java第四十一章:static关键字

全栈2019”Java第四十二章:静态代码块与初始化顺序

全栈2019”Java第四十三章:封装

全栈2019”Java第四十四章:继承

全栈2019”Java第四十五章:super关键字

全栈2019”Java第四十六章:继承与字段

全栈2019”Java第四十七章:继承与方法

全栈2019”Java第四十八章:重写方法Override

全栈2019”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第八十一章:外部类能否访问嵌套接口里的成员?

“全栈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学习小组”。
全栈工程师学习计划

关注我们,加入“全栈工程师学习计划”。

java包结构的规范性知识(Java第一百一十二章)(11)

版权声明

原创不易,未经允许不得转载!

猜您喜欢: