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

简述final

final修饰的类表示不可被继承,修饰方法表示此方法不可以被子类覆盖,但是可以被重载,修饰变量表示变量一旦被赋值就不可以更改它的值(基础类型是值,引用类型是地址)

修饰成员变量

   a. 如果final修饰的是类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初始值
   b. 如果final修饰的是成员变量,可以在非静态初始化块、声明该变量或者构造器中执行初始值

修饰局部变量

系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用final修饰局部变量时,即可以在定义时指定默认值(后面的代码不能对变量再赋值),也可以不指定默认值,而在后面的代码中对final变量赋初值(仅一次)

public class FinalReferenceTest{public static void main(){final int[] iArr={1,2,3,4};iArr[2]=-3;//合法iArr=null;//非法,对iArr不能重新赋值final Person p = new Person(25);p.setAge(24);//合法p=null;//非法}
}

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

就是比如说假设有一个Test类,然后我们里面创建了一个匿名内部类,而编译之后其实会生成两个class文件,Test.classTest1$.class

而又因为内部类和外部类其实是处于同一个级别的也就是说匿名内部类并不会因为定义在外部类方法之中就会随着方法的执行完毕而被销毁

所以这就会导致一个问题:当外部类的方法结束的时候,外部类的局部变量就会被销毁,因为随着栈弹出了嘛,但是这时候内部类对象可能还会存在(只是没有人引用它时,才会死亡,但是有可能它的引用通过方法调用被传给其他变量了呀,所以不会死亡)。

所以就出现了一个问题,也就是内部类对象访问了一个不存在的变量,因为那个变量被栈弹出去了

为了解决这个问题,就将局部变量复制了一份作为内部类的成员变量,这样的话当局部变量死亡之后,内部类仍然可以访问它(实际上访问的是局部变量的"copy"

而将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们在内部类中修改了成员变量,方法中的局部变量也得跟着改变,怎么解决问题呢?

所以就将局部变量设置为final,对它初始化后,我就不让你再去修改这个变量,就保证了内部类的成员变量和方法的局部变量的一致性。这实际上也是一种妥协。使得局部变量与内部类内建立的拷贝保持一致!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ARMv8/v9 GIC- 700 系列 2 -- GIC-700 上电控制寄存器 GICR_PWRR】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 GIC-700 上电GICR_PWRR 寄存器字段介绍GICR_PWRR 功能说明GICR_PWER 代码配置GICR_PWRR 使用场景GICR_PWRR 注意事项GIC-700 上电 GICR_PWRR(功耗寄存器)是ARM GICv4架构中用于控制GIC-700是否可以关闭电源的寄存器。它通过几个位…

sql server插入数据或查询慢如何诊断?

SQL Server插入数据慢的原因可能有多种,具体原因需要根据实际情况进行分析。以下是一些常见的原因及解决办法: 1. 索引问题 大量索引:在插入数据时,SQL Server需要更新所有相关的索引,这会增加插入操作的开销。 解决…

git-常用基础指令

一、基本指令 1. 配置用户名和邮箱 git config --global user.name "Your Name" git config --global user.email "your.emailexample.com"2. 初始化仓库 git init3. 克隆仓库 git clone <repository_url>4. 查看当前状态 git status5. 添加文件…

iPython与Matplotlib:数据可视化的秘籍

iPython与Matplotlib&#xff1a;数据可视化的秘籍 前言 欢迎来到"iPython与Matplotlib&#xff1a;数据可视化的秘籍"教程&#xff01;无论你是数据可视化新手还是希望提升技能的专业人士&#xff0c;这里都是你开始的地方。让我们开始这段数据可视化之旅吧&#…

C++:opencv将彩色图转换为灰度图

在C中&#xff0c;使用OpenCV库将彩色图转换成灰度图是一个相对直接的过程。你可以使用cv::cvtColor()函数&#xff0c;该函数可以将图像从一个颜色空间转换到另一个颜色空间。对于将彩色图转换为灰度图&#xff0c;你通常会从BGR颜色空间&#xff08;OpenCV中默认的彩色图像格…

Go语言并发编程-Goroutine调度

goroutine 概念 在Go中&#xff0c;每个并发执行的单元称为goroutine。通常称为Go协程。 go 关键字启动goroutine go中使用关键字 go 即可启动新的goroutine。 示例代码&#xff1a; 两个函数分别输出奇数和偶数。采用常规调用顺序执行&#xff0c;和采用go并发调用&…

Go 1.19: 性能提升与新特性

Go语言&#xff0c;以其简洁、高效和并发支持而广受欢迎。随着Go 1.19版本的发布&#xff0c;Go语言再次为开发者带来了一系列新特性和改进。本文将介绍Go 1.19的主要变化、新特性以及如何开始使用这个新版本。 Go 1.19 简介 Go 1.19是Go语言的一次重大更新&#xff0c;它在性…

OpenCV教程:cv2如何把两张图片的大小,设置成相同的宽高

-------------OpenCV教程集合------------- Python教程99&#xff1a;一起来初识OpenCV&#xff08;一个跨平台的计算机视觉库&#xff09; OpenCV教程01&#xff1a;图像的操作&#xff08;读取显示保存属性获取和修改像素值&#xff09; OpenCV教程02&#xff1a;图像处理…

前端开发实际项目中常见的实用技巧

CSS filter .logo1 {/* 设置阴影 */filter: drop-shadow(1px 1px 10px #333); } .title {/* 设置模糊度,值越大,越模糊*/filter: blur(1px); } .logo2 {/* 设置对比度,值越大,对比度越大 */filter: contrast(10); } .logo3 {/* 设置制灰程度,常用于一些特殊日子 */filter…

什么是虚拟DOM?什么是diff算法?

虚拟DOM&#xff08;Virtual DOM&#xff09;是一种用JavaScript对象表示的虚拟的页面DOM结构。它是对实际的DOM对象的抽象&#xff0c;可以在内存中进行操作和计算&#xff0c;而不需要直接操作真实的DOM。当数据发生变化时&#xff0c;虚拟DOM会进行一次全量比较和更新&#…

【html】html的基础知识(面试重点)

一、如何理解HTML语义化 1、思考 A、在没有任何样式的前提下&#xff0c;将代码在浏览器打开&#xff0c;也能够结构清晰的展示出来。标题是标题、段落是段落、列表是列表。 B、便于搜索引擎优化。 2、参考答案 A、让人更容易读懂&#xff08;增加代码可读性&#xff09;。 B、…

如何用EXCEL自动解方程/方程组?利用 矩阵乘法X=A-*B,X=mmult(minverse(A), B)

目录 问题的由来 1 数据 → 模拟分析 → 单变量求解 1.1 找一个单元格填入公式 1.2 功能入口 1.3 选择单变量求解&#xff0c;分别填入内容 1.4 求解 1.5 这个感觉用处不大 2 重点介绍&#xff0c;用EXCEL进行矩阵运算解方程的操作 2.1 运用EXCEL进行矩阵运算&…

Mac 安装MySQL 配置环境变量 修改密码

文章目录 1 下载与安装2 配置环境变量3 数据库常用命令3.1 Mac使用设置管理mysql服务启停 4 数据库修改root密码4.1 知道当前密码4.2 忘记当前密码4.3 问题 参考 1 下载与安装 官网&#xff1a;https://www.mysql.com/ 找到开源下载方式 下载社区版 2 配置环境变量 对于Mac…

Ubuntu16.04环境下Baxter机器人开发环境搭建要点说明

Ubuntu16.04环境下Baxter机器人开发环境搭建要点说明 前面写过一篇文章&#xff0c;描述了在ubuntu20.04环境下baxter机器人开发环境的搭建&#xff0c;本人在后来的使用中&#xff0c;出于一些原因又在ubuntu16环境下搭建了开发环境&#xff0c;二者总体流程基本类似&#xf…

TikTok内嵌跨境商城全开源_搭建教程/前端uniapp+后端源码

多语言跨境电商外贸商城 TikTok内嵌商城&#xff0c;商家入驻一键铺货一键提货 全开源完美运营&#xff0c;接在tiktok里面的商城内嵌&#xff0c;也可单独分开出来当独立站运营 二十一种语言&#xff0c;可以做很多国家的市场&#xff0c;支持商家入驻&#xff0c;多店铺等等…

大数据之数据抽取架构演变过程

架构演变之Flink架构的演变过程 一、 起初搭建整个大数据平台是基于CDH这一套资源管理和整合的CM资源管理器搭建的 整个平台包括了&#xff1a; HDFS&#xff0c;YARN&#xff0c;HIVE&#xff0c;zoozie,FLINK,Spark,Zookeeper等组件搭建而成&#xff0c; 刚开始搭建的时候&am…

面试问题:React基本概念,和所遇到的CPU和IO问题

在官方文档里面可以看见React基本设计概念&#xff0c;React是用 JavaScrip构建快速响应的大型Web应用程序的首选方式&#xff0c;但是快速响应用一定的是依赖&#xff0c;CPU的性能和IO的约束。 首先CPU性能原因&#xff1a;大部分浏览器的刷新频率为60HZ&#xff0c;及16.6ms…

golang 基础 泛型编程

&#xff08;一&#xff09; 示例1 package _caseimport "fmt"// 定义用户类型的结构体 type user struct {ID int64Name stringAge uint8 }// 定义地址类型的结构体 type address struct {ID intProvince stringCity string }// 集合转列表函数&#…

java内存回收

要回收哪些地方的内存&#xff1a;虚拟机堆、元空间&#xff08;持久代 -常量池、类名、方法名、字段&#xff09; 确认哪些对象可以被回收&#xff1a;引用计数法 、 可达性分析法&#xff08;gcroot&#xff09; 回收方法&#xff1a;标记清除法&#xff08;产生碎片&#…

第十届能源材料与电力工程国际学术会议(ICEMEE 2024)

第十届能源材料与电力工程国际学术会议&#xff08;ICEMEE 2024) 2024 10th International Conference on Energy Materials and Electrical Engineering 重要信息 ICEMEE 2024已通过SPIE - The International Society for Optical Engineering (ISSN: 0277-786X)单独出版…