JAVA 方法内部类为何只能访问外部final类型变量

Java 并发编程(二)对象的不变性和安全的发布对象 满足同步需求的另一种方法是使用不可变对象(Immutable Object)。到目前为止,我们介绍了许多与原子性和可见性相关的问题,例如得到失效数据,丢失更新操作或光查到某个对象处于不一致的状态等等,都与多线程视图同时访问同一个可变的状态相关。如果对象的状态不会改变,那么这些问题与复杂性也就自然消失了。 如果某个对象在被创建后其状态就不能被修改,那么这个对象就被成为不可变对象。线程安全型是不可变对象的固有属性之一,他们的不变性条件是由构造函数创建的,只要他们的状态不改变,那么这些不变性条件就 阅读详情

本文转自 https://blog.youkuaiyun.com/Thousa_Ho/article/details/73104015

所谓“局部内部类”就是在对象的方法成员内部定义的类。而方法中的类,访问同一个方法中的局部变量,却必须要加上一个final。

原因是编译程序实现上的困难:

内部类对象的生命周期会超过局部变量的生命期。


局部变量的生命期:当该方法被调用时,该方法中的局部变量在栈中被创建,当方法调用结束时,退栈,这些局部变量全部死亡。
内部类对象生命期,与其它类一样,当创建一个局部内部类对象后,只有当没有其它人再引用它时,它才能死亡。


所以完全可能一个方法已调用结束(局部变量已死亡),但该局部类的对象仍然活着。即:局部类的对象生命期会超过局部变量。

局部内部类的对象访问同一个方法中的局部变量,那么这就要求只要局部内部类对象还活着,那么栈中的那些它要访问的局部变量就不能“死亡”(否则:它都死了,还访问个什么呢?)。这就是说:局部变量的生命期至少等于或大于局部内部类对象的生命期。

解决方法:

局部内部类的对象可以访问同一个方法中被定义为final的局部变量。定义为final后,编译程序的实现方法:

将所有的局部内部类对象要访问的final型局部变量,都拷贝成为该内部类对象中的一个数据成员。这样,即使栈中局部变量(含final)已死亡,但由于它是final,其值永不变,因而局部内部类对象在变量死亡后,照样可以访问final型局部变量。

归纳总结:局部内部类对象中包含有要访问的final型局部变量的一个拷贝,成为它的数据成员。因此,正是在这个意义上,final型局部变量的生命期,超过其方法的一次调用。

严格来说,方法调用结束,所有的局部变量(含final)全死亡了。但:局部内部类对象中有final型局部变量的拷贝。
--------------------- 
版权声明:本文为优快云博主「heqianqiann」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/Thousa_Ho/article/details/73104015

MPU6050模块DIY翻车实录:ID能读但数据全为零?原来是这个10uF电容惹的祸 本文详细记录了MPU6050模块调试过程中遇到的ID能读但数据全为零的问题排查过程。通过对比不同参考设计,发现CPOUT引脚10uF电容选择不当是导致数据异常的根源,更换为官方推荐的2.2nF电容后问题解决。文章为硬件开发者提供了宝贵的电路设计经验。 阅读详情

相关推荐

相位相关匹配法的opencv C++实现

这一段就是PCIAM算法的核心了,计算两幅图像的峰值相关矩阵,也是完全按照matlab移植过来的,但是后面几行,是为了筛选一些不可能存在的情况,比如边缘处的完全重合,或者只有一行,或者一列重合等等情况,由于PCIAM算法在边缘处的响应值高,所以在一些场景下可能是一种干扰,所以进行了剔除,当然可以不剔除,就是对后期的峰值选取会有影响。头文件,以及各类函数,还有主函数,第一次独立的写这种分文件类型的项目,写的拉跨还请包涵,以及当然可以转成类的形式,但感觉有点小麻烦,后期再修改吧。

qq_43616651的博客 4266

java内部类访问外部类变量 final_Java内部类引用外部类中的局部变量为何必须是final问题解析...

今天编写一个多线程程序,发现在方法内定义内部类时,如果内部类调用了方法中的变量,那么该变量必须申明为final类型,百思不得其解,后来想到应该 是生命周期的原因,因为方法内定义的变量是局部变量,离开该方法,变量就失去了作用,也就会自动被消除,而内部类却不会离开它所在方法就失去作用,它有更 广的生命周期,下面通过一个实例加以说明:如例中所示,在外部类Outer中声明了一个内部类TimerPrint,...

weixin_32821477的博客 279

Zynq UltraScale+ RFSoC实战:用XCZU49DR开发板实现雷达信号处理全流程

本文详细介绍了如何利用Xilinx Zynq UltraScale+ RFSoC系列中的XCZU49DR开发板,高效实现雷达信号处理全流程。文章深入剖析了该芯片集成的射频直采ADC/DAC、可编程逻辑与Arm多核处理器的异构计算优势,并通过实战案例展示了从环境搭建、硬件链路设计到软件优化的完整开发路径,为相控阵雷达等高性能应用提供了单芯片解决方案。

weixin_29291863的博客 578

为什么内部类调用的外部变量必须是final修饰的?

因为生命周期的原因。方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象。首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而跟随者被销毁。问题就来了,如果外部类的方法中的变量不定义final,那么当外部类方法执行完毕的时候,这个局部变量肯定也就被GC了,然而内部类的某个方法还没有执行完,这个时候他所引用的外部变量已经找不到...

Cruise的博客 5955

Unity UI适配实战:从Canvas Scaler到主流游戏适配方案解析

本文深入解析Unity UI适配的核心技术,重点介绍Canvas Scaler组件的关键参数如Reference Resolution和Screen Match Mode,并提供主流游戏适配方案实战分析。通过九宫格拉伸、动态调整等技巧,帮助开发者解决多设备适配难题,提升游戏UI在不同分辨率下的表现。

weixin_29001419的博客 973

微信聊天记录丢失原因与恢复方案详解

SQLite数据库作为移动应用常见的本地存储方案,其加密机制和存储结构直接影响数据安全性。以微信为例,聊天记录存储在EnMicroMsg.db等SQLite文件中,采用AES加密保护。当手机清理工具误删这些文件时,会导致特定时间段记录丢失。理解数据恢复原理需要掌握文件系统删除机制和闪存特性,其中关键点包括TRIM指令的影响和数据块覆盖风险。通过专业工具如DiskDigger或iMyFone D-Back,配合ADB调试和SQLite数据重组技术,可在黄金时间窗口内恢复记录。日常维护建议结合自动化备份方案和存

weixin_32612263的博客 386

为什么匿名内部类和局部内部类只能访问final变量

 在java中, 方法的内部类可以访问方法中的局部变量,但必须用final修饰才能访问。 原因:    一, 当方法被调用运行完毕之后,局部变量就已消亡了。但内部类对象可能还存在,            直到没有被引用时才会消亡。此时就会出现一种情况,就是内部类要访问一个不存在的局部变量。                             二,解决这一问题的办法就是使用fi

H_shaohui的博客 504

手把手教你设计MTBF加速寿命试验:从阿伦尼斯模型到卡方计算(含Excel模板)

本文详细介绍了如何设计MTBF加速寿命试验,从阿伦尼斯模型到卡方计算,帮助工程师在合理时间内获得准确的MTBF数据。通过工业电源模块的实例演示,涵盖活化能确定、温度应力设计、样本量计算及数据记录规范,并提供Excel模板实现自动化计算,显著提升测试效率。

weixin_42563415的博客 545

为什么在方法中定义的内部类只能访问方法中的final类型的局部变量?

为什么在方法中定义的内部类只能访问方法中的final类型的局部变量? class InOut { String str=new String ("Between"); public void amethod(final int iArgs) { int i...

aezympxj84131的博客 1649

YOLO11有效改进专栏目录

YOLO11改进专栏导航

A1983Z的博客 3684

【Python】-- 趣味代码 - 发牌游戏

Python -- 趣味代码 - 发牌游戏

银尘博客 352

静态内部类、局部内部类可访问的变量限制

1、局部内部类: 可以访问的变量:(1)外部类的类变量(2)外部类的成员变量(3)所在方法中被final修饰的变量。 2、静态内部类: 可以访问的变量:(1)外部类的类变量 3、代码测试: import java.util.*; public class Main { //test code int aaa=1; final int bbb=2;

iCoding91 1841

YOLOv8自动驾驶系统 —— 夜间低光照条件 详细说明和完整代码

本文提出一种针对夜间低光照优化的自动驾驶车道保持系统方案,基于YOLOv8模型改进,包含三大核心技术:1.采用Retinex理论的多尺度低光增强算法,结合自适应伽马校正;2.改进YOLOv8的车道检测模型,通过夜间专用数据集训练,增加抗眩光处理;3.多传感器融合框架,整合可见光与红外图像。系统实现动态逆透视变换和参数调整,在Jetson Orin硬件上达到30ms级实时性能。测试显示在无照明、眩光干扰等极端场景下保持稳定,代码已开源。扩展方向包括V2X协同定位和自适应大灯联动控制。

u010117029的博客 598

Thread匿名内部类为什么 必须声明为final变量?

匿名内部类使用定义在外部的变量,该变量必须是final类型1:匿名内部类没有构造函数,无法对引用变量进行初始化。所以引用的参数必须是在外部已经初始化的final变量。 2:匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final。因为虽然匿名内部 类在方法的内部,但实际编译的时候,内部类编译成Outer.Inner,这说明内部类所处...

最后一页 的博客 1458

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STM32F407中文手册

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

Java内部类:Java局部内部类

局部内部类是指在一个方法中定义的内部类。示例代码如下: public class Test { public void method() { class Inner { //局部内部类 } } } 局部内部类有如下特点。 (1) 局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。 (...

jijiangpeng的博客 215

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java内部类3:Java局部内部类

局部内部类是指在一个方法中定义的内部类。示例代码如下: public class Test { public void method() { class Inner { //局部内部类 } } } 局部内部类有如下特点。 (1) 局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。 (2)...

Yummy的博客 244

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

KKB:内部类一句话概括、成员内部类、局部内部类、匿名内部类(只能访问final型的局部变量)、静态内部类

内部类 可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类 成员内部类 最基本的一个内部类 下面的例子 介绍了如何创建一个成员内部类以及如何使用 成员内部类 是可以直接调用外部类的成员变量和方法的 如果外部类和内部类都有变量x,那么内部类直接使用的是自己内部类的x 如果想使用外部的同名变量,需要使用外部类.this.成员变量名 局部内部类 这就是一个局部内部类 匿名内部类 接口不能实例化,但是匿名内部类 就相当于new 了一...

awodwde的博客 395

为什么匿名内部类参数必须为final类型

转自:http://www.189works.com/article-97599-1.html 摘要: 1) 从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的2) 为什么JAV ...

yaowj2的专栏 768

局部内部类为什么访问方法中的局部变量时局部变量要加final

1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的 2)  为什么JAVA中要加上一条限制:只能访问final型的局部变量? 3)  JAVA语言的编译程序的设计者当然全实现:局部内部类能访问方法中的所有的局部变量(因为:从理

q563717212的专栏 461

java局部内部类与方法里final变量的关系

在java中的局部内部类中及就是在方法中定义的内部类,局部内部类仅在方法内有效。他不能定义静态的东西,不能被public,protected和private所修饰,,而且在内部类中只能访问方法中的 final类型的参数与变量,因为final定义的变量相当于常量,可以延长变量的生命周期,就算方法撤销,其内部类 仍能访问final类型的变量。

ho994562751的博客 751

匿名内部类使用外面的类为什么要用final型

为什么匿名内部类参数必须为final类型 1)  从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形式参数定义处或者方法体处),因而访问方法中的局部变量(形式参数或局部变量)是天经地义的.是很自然的 2)  为什么JAVA中要加上一条限制:只能访问final型的局部变量? 3)  JAVA语言的编译程序的设计者当然全实现:局部内部类

欢迎关注公众号:【码农突围】,公号后台回复9999,可以获取一份500页的LeetCode刷题笔记。 1615
上一篇: POI:getLastRowNum()与getLastCellNum()
下一篇: 类加载器
AE86上山啦
博客等级 码龄8年 5粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值