恕我孤陋寡闻,因为这次面试才第一次听说Java中的函数闭包

Java实用工具集:闭包、KD树与图形算法 本文还有配套的精品资源,点击获取 简介:Java工具类库为简化编程任务提供了重要支持,本资源重点介绍了闭包工具、KD树和图形算法三大组件。闭包工具通过允许函数传递和作用域变量访问,提升代码简洁性和灵活性。KD树作为处理多维数据的空间分割结构,尤其适用于近邻搜索和高效数据操作。图形算法则解决图数据结构相关问题,如路径查找和最小生成树等,广泛应用于网络和图论问题解决中。这些工具... 阅读详情

​最近接到了一个公司的视频面试,在面试过程中被问到在Java中匿名内部类和lambda表达式中如果使用外部的变量,需要注意什么,当然,如果在开发中使用过lambda表达式或匿名内部类,并且需要使用外部的变量的话,即使自己没有这个意识,idea也会给出提示必须使用final进行修饰,否则,就报出受检异常了,在程序编译器就不能通过。然后我就直接说必须使用final进行修饰了,否则报错,程序不能通过编译,不料对方随即就问,为什么要这样做呢,为什么非要使用final进行修饰呢?emmm(表情开始逐渐凝固),然后陷入沉思,自己想lambda是匿名内部类的优化方式,肯定也是基于匿名内部类进行实现的,然后从内部类上分析,发现没有找到答案,从实现类和接口的结构上想想,仍然是没有头绪,然后自己想难道是在编译成class文件中就是这样要求的,但是我也没有反编译过lambda之后的class文件,根本不知道啊,捉鸡,慌了,awsl,面试官似乎看出了我的尴尬,最后指给我说了下这涉及到函数闭包的概念,然后就下个问题了。

然后自己私下里查了些资料,大众的说法函数闭包的概念就是:

闭包是ECMAScript (JavaScript)最强大的特性之一,Java并不能显式地支持闭包,但对于非静态内部类而言(注意是非静态内部类,稍后会有各种内部类的区别对比),它不仅记录了其外部类的详细信息,还保留了一个创建非静态内部类对象的引用,并且可以直接调用外部类的private成员,因此可以把非静态内部类当成面向对象领域的闭包。

其实形象化地理解下来就是lambda本质还是调用的方法,如果使用的变量是基本类型就要final修饰,相当于值传递,如果是引用类型就不用final修饰,引用传递。值传递是使用其他方法栈里面的变量,不应该修改其他方法栈里面的基本类型变量。

我随便找了个例子看一下区别:

这里基本类型threadCount在lambda中进行++操作,但是threadCount并没有被final进行修饰,当然这里就报错了。

然后这种情况下我测试的是latch这个引用类型变量,因为引用类型传递的是引用类型的指针,所以其指针指向的内容可以随意修改,并没有什么问题。演示效果这里就不再执行了。

然后还有人给出的解决方法是对于基本类型可以使用包装类型进行代替,其实本质还是将其替换成引用类型。

当然对于函数闭包应该谨慎使用,因为泛滥使用函数闭包会使大量的内存得不到释放导致内存泄漏。对于函数闭包这是个人的理解,若有出入还望指正。

作为记录,在这里罗列一下这次面试中能够回忆到的大致一些点吧:

Redis相关的:

①、zSet的使用(怎么实现类似MySQ Llimit功能)

②、incr是先加后获取值还是先获取值然后执行加1

③、Redis数据结构实现原理

④、Redis单线程模型分析

MySQL相关的:

①、B+树基本存储结构

②、B+树为什么非叶子结点不存储数据

③、联合索引的最左匹配原则(各种场景举例判断是否走索引)

④、MySQL8使用索引的index merge特性

⑤、SQL一般优化方法(索引的使用、索引失效、explain的使用-哪些场景下看哪些字段判断需要进行SQL优化和SQL优化的入手点)

⑥、MySQL锁相关-间隙锁

Java SE相关:

①、forkJoinPool的原理

②、forkJoinPool的思想(分而治之)以及分而治之适合、不适合哪些场景

③、函数闭包

④、Automic包下类实现原理(CAS、UNSAFE、缓存一致性协议)

源码相关:

①、mybatis Executor除了BATCH还有哪些类型,BATCH有没有其他替代方式

②、mybatis怎么控制事务回滚、提交

③、spring事务传播机制原理

④、IOC、AOP原理

能回忆到的大致这些吧,还有一些忘了,幸运的是这次面试过了,继续第二次线上面试,其实这次面试还是挺贴近基础的,至于分布式、并发场景、大数据量处理其实没有涉及太多,Java技术栈各种框架源码还需要学习,加油吧,学习力才是竞争力。

附:

Java中的各种内部类对比区分:

①、成员内部类

class  Outer1{

      class Inner1{

      }

 }

(1)、成员内部类与实例变量/实例方法一样, 都是属于某个 Outer1对象的

(2)、在成员内部类中可以定义实例变量/实例方法, 不能定义静态成员

(3)、成员内部类可以直接使用外部类的成员

(4)、一般在Outer1外部类的实例方法中会创建成员内部类对象

(5)、所有的类编译后都会生成单独的字节码文件: Outer1$Inner1.class

②、静态内部类

class  Outer2{

           static  class Inner2{

          }

}

(1)、静态内部类与静态变量/静态方法一样, 不属于某个外部类对象

(2)、在静态内部类中不仅可以定义实例成员还可以定义静态成员

(3)、在静态内部类中,不能直接使用外部类的实例成员

(4)、一般在外部类Outer2的静态方法中, 创建静态内部类inner2的对象

(5)、编译为单独的字节码文件

③、局部内部类

class  Outer3{

       public  void   method  ()  {

            class  Inner3{

             }

       }

}

(1)、在方法体中定义的内部类就是局部内部类

(2)、它的使用域 是从定义的位置开始直到包含它的大括弧结束

(3)、编译为单独的字节码文件

④、匿名内部类

之前的内部类都有一个类名, 通过类名创建对象。

匿名内部类是指没有类名的内部类,  内部类的定义与内部类对象的创建是一起的。

接口/抽象类的引用可以赋值匿名内部类对象。

一般情况下, 当接口的实现类,或者抽象类的子类只使用一次的时候,  不需要单独的定义一个类, 直接使用匿名内部类即可。

 

更多内容持续更新中,感兴趣的朋友请移步至个人公众号,谢谢支持😜😜......

公众号:wenyixicodedog

Java内部类之间的闭包和回调详解 相信闭包和回调对每位学习Java的人来说都不陌生,那么今天小编和大家分享一篇关于Java内部类之间的闭包和回调,有需要的可以参考借鉴。 立即下载

相关推荐

AI辅助专利撰写实战:30分钟高效产出发明专利初稿

在技术创新的浪潮中,专利撰写常常是开发者将创意转化为知识产权保护壁垒的关键一步,但这个过程往往耗时费力,需要兼顾技术深度与法律文书规范。近期,借助AI辅助工具来提升专利撰写效率已成为一个热门探索方向。本文将围绕如何利用AI工具,在30分钟内高效完成一篇具备授权潜力的发明专利初稿,进行一场从0到1的实战演练。无论你是独立开发者、初创团队的技术负责人,还是希望保护自己研究成果的学生,这套方法都能帮助你快速梳理技术方案,形成结构严谨、逻辑清晰的专利申请文档。 1. 背景与核心概念:AI辅助专利撰写的价值与边界 在

weixin_34253126的博客 495

闭包和局部内部类的区别

局部内部类就像是方法里面的一个局部变量一样,是不能有public、protected、private以及static修饰符的。 闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域的信息。JAVA并不能显式地支持闭包,但是在JAVA中,闭包可以通过“接口+内部类”来实现。 例如:一个接口程序员和一个基类作家都有一个相同的方法work,相同的方法名,但是其含义完全不同,这时候就需要闭...

suncat的博客 3615

斯坦福HumanPlus机器人核心技术解析:从HST强化学习框架到HIT模仿学习的实现路径

本文深入解析了斯坦福HumanPlus人形机器人的核心技术实现路径。其核心在于HST强化学习框架与HIT模仿学习架构的协同:HST作为“小脑”,通过rsl_rl框架在仿真中训练稳健的低级运动控制;HIT作为“大脑”,基于改进的Transformer架构学习高级任务规划。文章详细拆解了从算法原理、代码实现到硬件部署的全流程,为复现这一前沿机器人系统提供了实战指南。

weixin_29082143的博客 281

java内部类回调_(十)、java内部类与内部类的闭包和回调

一、成员内部类1.可以把一个内部类看做是一个成员。成员内部类可以无条件访问外部类的所有成员属性和成员方法。class OutterClass {//外部类private int in = 0;static int inn=4;public OutterClass(intin) {this.in =in;}class InnerClass { //内部类public voidoutput()...

weixin_42299310的博客 214

[Adaptive Autosar]深入理解--Time Synchronization

目录 1.TS典型应用场景 2.CP和AP时间同步对比 3.时间同步基础知识 4.TBR部分参数说明 5. TS功能说明 5.1 基本说明 5.2 时间纠正计算说明 5.3 时间验证 Time Synchronization 时间同步,后面简称TS 1.TS典型应用场景 时间同步,典型应用就是在自动驾驶领域,自动驾驶领域涉及到各个传感器的数据采集,如IMU采集当前车身姿态和运动信息,毫米波雷达-超声波雷达-环视摄像头-前视摄像头...等等传感器捕获的数据,在算法中需要精确知道每个数.

AgingMoon的博客 3997

VSCode玩转Arduino:手把手解决‘未定义Serial’和头文件找不到的坑

本文详细介绍了在VSCode中配置Arduino开发环境时遇到的‘未定义Serial’和头文件找不到问题的解决方案。通过修改c_cpp_properties.json文件、调整IntelliSense引擎设置以及添加正确的库路径,开发者可以高效解决这些常见错误,提升开发体验。文章还提供了针对不同开发板和平台的高级配置技巧,确保配置的长期有效性。

weixin_42620202的博客 359

java闭包和内部类的区别_JAVA 内部类与闭包

JAVA 内部类与闭包内部类可以很好的实现类的隐藏,内部类可以拥有外部类的全部元素的访问权限。通过内部类可以实现多重继承(外部类继承一个,内部类继承一个,然后内部类就可以调用到继承类的方法和属性)。可以避免修改接口,而实现同一个类中两种同名方法的调用。成员内部类一个类里面定义的私有内部类,可以被外部类的其他多个方法使用静态内部类成员内部类加上static修饰的就是静态内部类,静态内部类只能访问外部...

weixin_39910523的博客 350

西门子S7-1200 PLC与伺服电机控制实战解析

工业自动化控制系统中,PLC(可编程逻辑控制器)与伺服电机的协同工作是实现精密运动控制的核心技术。通过PROFINET工业以太网协议,PLC可以高效地控制多台伺服电机,实现定位、同步和插补等复杂运动。在实际工程应用中,硬件组态的正确配置和运动控制算法的优化是关键挑战。本文以西门子S7-1200 PLC控制五台伺服电机的项目为例,详细介绍了从硬件组态、运动控制程序实现到HMI界面设计的全流程。特别针对多轴同步插补运动、动态速度曲线调整等特殊工艺需求,提供了实用的解决方案和调试技巧,为工业自动化领域的工程师提供

weixin_30252709的博客 497

java闭包和内部类的区别_闭包与内部类

闭包与内部类中英文社区中,比较常见的对闭包的定义是引用了自由变量的一段代码或函数,被引用的自由变量和函数(一段代码)共同存在,即使离开了创造它的环境内部类按照我的理解,scala/java中虽然并不存在语法级地支持或是定义,对于闭包而言,一些概念和闭包的概念一致。一般理解scala中的一些概念,我会倾向于从Java开始。Java中的内部类在java中,内部类有:成员内部类静态内部类局部内部类匿名内...

weixin_42517044的博客 424

Universal Robot——在Gazebo中模拟UR5机器人

今天的目标是在Gazebo安装我们的ur5机器人。Gazebo是一个流行的模拟工具,它不仅可以让你像在Rviz中一样可视化你的机器人,而且还内置了一个物理引擎。这样你就可以在更真实的环境中测试你的机器人应用程序。我们将查看我们需要的属性 添加对我们的机器人——我们的order的描述,以模拟它以及如何在Gazebo中生成我们的机器人。

如果想成为中心,那么就到中心去吧。 1970

把 ABAP 经验装进 GitHub Copilot 的按需大脑,Agent Skills 如何改变 ABAP 开发

2026 年 8 月,SAP Community 上出现了一次很有代表性的 ABAP 实验。开发者把标准 Flight Model 里的复制成自己的测试类,删除原有 ABAP Unit Test,再让 GitHub Copilot Agent 为方法重新生成测试代码。真正有意思的地方并不是 Copilot 会不会写,而是开发者给 Copilot 准备了两个专门的 Agent Skills,一个负责 ABAP Unit Test 的通用规则,一个负责 ABAP Test Double Framework。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 157

深入理解Java闭包概念

闭包又称词法闭包 闭包最早定义为一种包含<环境成分>和<控制成分>的实体. 解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在。 解释二:闭包是函数和相关引用环境组成的实体。 注:<自由变量>:除了局部变量的其他变量 简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问...

weixin_30656145的博客 4401

SPI为什么不需要加上拉电阻

大家好,我是记得诚。I2C因为其开漏的结构,无法输出高电平,所以外部加上拉电阻。我们在使用SPI的时候,发现是不需要加上拉电阻的。主要因为SPI多为推挽的结构,推挽电路,高低电平都可以输出,所以外部不需要加上拉电阻。推挽电路可以用2个三极管或者2个MOS管搭建而成。

记得诚 2630

java闭包和内部类的区别_java 内部类和闭包

内部类(inner class)public class Outer{private String name;class Inner{public String getOuterName(){return Outer.this.name;}public void setOuterName(String name){Outer.this.name = name;}}public static voi...

weixin_39906114的博客 169

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

闭包(Java中的闭包)

闭包Java中的闭包 What 简单理解 WHY HOW Java中的闭包 内部类 局部内部类 匿名内部类 闭包(Java中的闭包):What 闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。 —《百度百科》 是引用了自由变量的函数。这个函数通常被定义在另一个外部函数中,并且引用了外部函数中的变

Ung8023 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

java 内部类与闭包

首先,让我们看看什么是内部类(Java 内部类,成员类,局部类,匿名类等): 根据内部类的位置不同,可将内部类分为 1. 成员内部类 2. 局部内部类 class C{ //成员内部类 class B{ } public void show1() { //局部内部类 class D{ } } } 成员内

yin__ren的博客 2万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

面试官:什么是闭包?

闭包是指一个函数能够捕获并保持其定义时的作用域中的变量,即使这个函数在其定义作用域之外被调用。这意味着即使外部函数已经返回,内部函数依然能够访问外部函数的变量。

qq_28791753的博客 358

java 有没有闭包的概念_深入理解Java闭包概念

闭包又称词法闭包闭包最早定义为一种包含和的实体.解释一:闭包是引用了自由变量的函数,这个被引用的变量将和这个函数一同存在。解释二:闭包是函数和相关引用环境组成的实体。注::除了局部变量的其他变量简单理解:闭包能够将一个方法作为一个变量去存储,这个方法有能力去访问所在类的自由变量。Java中闭包实现关键点:如何用变量去存储方法?java中能够保存方法的变量指的就是普通的对象如何让这个普通对象能够访问...

weixin_31601663的博客 521

java面试之闭包(closure)

今天在学习Openresty的时候回顾了下闭包这个问题,感觉很久没有深入的了解这块的内容的,只是之前js的时候学习过闭包,突然一问,感觉不记得闭包了: 看了一个比较有趣的答案: 闭包,顾名思义,就是把馒头变成包子~ 馒头全是面粉,包上馅就成了包子 包子是带馅的馒头 闭包是自带运行环境的函数 发哥是自带背景音乐的男人~ 有童鞋不理解“自带运行环境”的含义~ 再举例说一次吧~ 码农们都...

weixin_34202952的博客 359

面试问题:什么是闭包

什么是闭包?闭包的优缺点? 闭包(closure)是javascript的一大难点,也是它的特色。很多高级应用都要依靠闭包来实现。 1、变量作用域 要理解闭包,首先要理解javascript的特殊的变量作用域。 变量的作用域无非就两种:全局变量和局部变量。 javascript语言的特别之处就在于:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。 注意点:在函数...

mark's technic world 6146

内部类(闭包与回调)

http://jiangzhengjun.iteye.com/blog/658354 动态语言的闭包是一个永恒的话题。闭包在编码过程的方便和快捷使得动态语言的拥护者对它津津乐道,而静态语言特别是Java语言的扇子们会拿出匿名内部类来说Java语言也有类似的功能。   JavaScript 中闭包的产生是由于 JavaScript 中允许内部 function,也就是在一个 f

chivalry 1807

java 闭包 作用_面试题:为什么要用闭包?

你的回答是关于作用域的回答,不是关于闭包的。而且这个回答也是属于不严谨的回答。你根本解释不清什么是内部,什么是外部。我认为闭包是这样的。当一个函数在定义它的作用域以外的地方被调用时,它访问的依然是定义它时的作用域。这种现象称之为闭包。具体用途有好多,常见的有创建私有属性,函数柯里化等等。------------分割线------------我再补充一下,其实闭包的本质是静态作用域。因为 JavaS...

weixin_29471325的博客 363

JAVA局部内部类的适用 JDK8与之前的区别

java局部内部类的适用方法  public class LocalInnerClass { public static void main(String[] args) { OutClass out = new OutClass(); out.show(); } } class OutClass{ private int num1 = 1; private static i...

chierb的博客 797

JAVA内部类&闭包

首先回答一个问题,为什么我们需要用内部类?一般说来,内部类继承自某个类或者实现某个接口,内部类的代码操作创建它的外围类的对象。所以可以认为内部类提供了某种进入其外围类的窗口。也就是说,当外围类可以直接实现接口的时候,是不用使用内部类的,当外围类实现不了的时候才需要用内部类。除此之外,还有另外一层意思,内部类提供了一种进入其外围类的窗口。最后一点,由于每个内部类都可以独立的继承一个(接口的)实现,所以

kengkeng2017的博客 1311

内部类详解————局部内部类

内部类三连击: 《内部类详解————匿名内部类》 《内部类详解————局部内部类》 《内部类详解————静态嵌套类》 定义 在方法或某个作用域内的内部类,称为局部内部类。匿名内部类就是一种局部内部类。 实现方式 public class OutterType { public void function() { /** 局部内部类Inner*/ ...

Morty的技术乐园 1万+

闭包面试题详解

闭包详解 前言 现在去面试前端开发的岗位,如果你对面试官也是个前端,并且不是太水的话,你有很大的概率会被问到JavaScript中的闭包。因为这个闭包这个知识点真的很重要,还非常难掌握。 什么是闭包 什么是闭包,你可能会搜出很多答案… 《JavaScript高级程序设计》这样描述: 闭包是指有权访问另一个函数作用域中的变量的函数; 《JavaScript权威指南》这样描述: 从技术的角度讲,所有的JavaScript函数都是闭包:它们都是对象,它们都关联到作用域链。 《你不知道的JavaScript》这

WYQ1269551631的博客 1177
上一篇: Java多线程 之 CyclicBarrier源码分析
下一篇: 1000个苹果要分到10个箱子中去 两种分析方式
wenyixicodedog
博客等级 码龄8年 87粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值