当前位置: 首页 > news >正文

【JAVA基础】从内部类引用的局部变量必须是final或有效的final

从内部类引用的局部变量必须是final或有效的final

    • 为什么局部内部类 和 匿名内部类只能使用final 的变量?

public class Main {public static void main(String[] args) {test();}public static void test(){int a=1;class InnerTest{private void t(){System.out.println(a);// 在这里改变a的值是不对的a=2;}}new InnerTest().t();
}
}

运行报错
Main.java:13: error: local variables referenced from an inner class must be final or effectively final
a=2;
^

原因是内部类引用的局部变量必须是final或者有效的final
虽然没有主动声明a为final,但是编译的时候认为a就是final的

为什么局部内部类 和 匿名内部类只能使用final 的变量?

首先需要知道的一点是:
内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会随着方法的执行完毕就被销毁。这里就会产生问题:当外部类的方法结束时,局部变量就会被销毁了,但是内部类对象可能还存在(只有没有人再引用它时,才会死亡)。
这里就出现了一个矛盾:内部类对象访问了一个不存在的变量。为了解决这个问题,就将局部变量复制了一份作为内部类的成员变量,这样当局部变量死亡后,内部类仍可以访问它,实际访问的是局部变量的"copy"。这样就好像延长了局部变量的生命周期将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们在内部类中修
改了成员变量,方法中的局部变量也得跟着改变,怎么解决问题呢?就将局部变量设置为
final,对它初始化后,我就不让你再去修改这个变量,就保证了内部类的成员变量和方法的局部变量的一致性。这实际上也是一种妥协。使得局部变量与内部类内建立的拷贝保持一致。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 86.小米相机修改拍照(尺寸,画幅,比例)的方法
  • SAP B1系统设置和管理——数据所有权权限
  • 技术革新!MultiDesk:高效远程桌面管理工具,TAB切换引领新潮流!
  • 24/8/18算法笔记 MARL多智能体算法
  • 【免费】企业级大模型应用推荐:星环科技无涯·问知
  • 解决firefly rk3399使用ffmpeg硬解码rga报错的问题
  • PHP中如何将变量从函数传递给acf_add_filter
  • Golang基于DTM的分布式事务SAGA实战
  • 微前端架构:使用不同框架构建可扩展的大型应用
  • 【生成式人工智能-十一一个不修改模型就能加速语言模型生成的方法】
  • C语言进阶(9)
  • Python进阶之3D图形
  • Taro+Vue 创建微信小程序
  • Python Scripts: 超过60个Python脚本,助您自动化地完成各种任务,提升工作效率
  • Hadoop如何搭建计算和存储节点分离
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • happypack两次报错的问题
  • Iterator 和 for...of 循环
  • MaxCompute访问TableStore(OTS) 数据
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • nodejs调试方法
  • Spring声明式事务管理之一:五大属性分析
  • SQLServer之创建数据库快照
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 从输入URL到页面加载发生了什么
  • 搭建gitbook 和 访问权限认证
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 数据仓库的几种建模方法
  • 仓管云——企业云erp功能有哪些?
  • #HarmonyOS:Web组件的使用
  • #图像处理
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (7)STL算法之交换赋值
  • (C++哈希表01)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (function(){})()的分步解析
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (十六)视图变换 正交投影 透视投影
  • (一)基于IDEA的JAVA基础10
  • (转)linux 命令大全
  • (转)linux下的时间函数使用
  • .NET Core 中插件式开发实现
  • .Net Memory Profiler的使用举例
  • .Net Web项目创建比较不错的参考文章
  • .net 无限分类
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .NET文档生成工具ADB使用图文教程
  • .Net中wcf服务生成及调用
  • .vue文件怎么使用_我在项目中是这样配置Vue的