为什么局部内部类访问局部变量,局部变量必须声明为final?

LIS2DH三轴加速度传感器原理图设计,已量产(加速度传感器) 最近在做一款可穿戴设备原型时,选了 LIS2DH 这款加速度计 —— 比起之前常用的 ADXL345,它在低功耗和稳定性上的优化刚好戳中了可穿戴设备 “续航 + 可靠” 的核心需求。下面结合这次画的原理图,聊聊这个小模块的硬件设计细节。 阅读详情

今天在看AWT的事件处理机制的时候,突然对局部内部类中访问局部变量的情况有了一点小好奇,因为在java中规定,局部内部类访问外部类中方法的局部变量时,该局部变量必须定义为final。百度了老半天,发现说的都挺模糊的,结合查到 的结果再想了老半天,突然有所体会,现在将我认为合理的理由阐明如下,如有错误,还望各位大虾们给以纠正啊,呵呵。。。。。

首先来看一段代码:

public class MainClass {

	public static void main(String[] args) {
		A2 a2 = new A2();
		A1 a1 = new A1();
		a2.test(a1.getA1());

	}

}

class A1 {
	public void show() {
	}

	public A1 getA1() {
		final int variable = 10;
		class A2 extends A1 {
			public void show() {
				System.out.println(variable);
			}
		}

		return new A2();
	}
}

class A2 {

	public void test(A1 a) {
		a.show();
	}
}


以上代码的输出结果是:10

流程如下:

先调用a1对象的getA1()方法,该方法返回一个A1类的子类(A2类),返回的A2类,作为a2.test(A1 a)方法的参数,在test方法中,再调用A2类中的show方法,输出variable变量的值。


仔细观察代码会发现一个奇怪的现象:在调用完getA1()方法之后,该方法内部定义的variable变量的内存单元应该已经被清空,可是getA1()方法的返回值A2对象,却在test方法中调用的show方法中再次使用了variable变量,这个看起来是不是怪怪的呢,这里的variable变量难道就是原来那个应该被清空的variable变量?

以上出现的情况即为:局部内部类的生命周期可能比其使用的局部变量的生命周期要长

所以为了保证在局部内部类中使用的局部变量不会找不到值(即即使局部变量被清空了还能访问到值),则必须将局部变量“拷贝”一份到局部内部类中作为自身的内部变量(这部分工作由编译器完成),这样局部内部类访问的局部变量实际上是访问自身的内部变量,这样即使原来的局部变量的内存单元被清空了,局部内部类依然可以使用局部变量的值(已经拷贝到内部类中)。

这里可以得出一个重要的结论:即局部内部类中使用的局部变量实际上是"拷贝"后的变量


在这个结论的作为条件的前提下,再接下来的分析:

现在换一种常见的情况进行分析,即局部内部类的声明周期短于局部变量的生命周期(大部分情况应该都属于这种)

如果是这种情况,那么可能出现在内部类中对变量进行更改后(实际的更改是拷贝后的那份变量了,所以对原来的变量并不会产生影响)在方法中会再一次使用这个变量,此时就会出现数据的不一致性,即不管内部类中对变量如何更改,因为其更改的始终是拷贝的那份变量,所以外部类的局部变量将一直保持不变,为了避免这种不符合逻辑的情况出现,所以java规定局部内部类使用的局部变量必须为final,这样内部类“拷贝”的那份也定义为final变量,即不可更改,这样就避免了在内部类中对变量进行更改,这样内部类和外部类的局部都不能对变量进行更改,也就避免了非逻辑情况的出现。

ardupilot 方向余弦矩阵/旋转矩阵的理解 本节主要记录自己对ardupilot中用到的方向余弦矩阵/旋转矩阵的理解,欢迎批评指正,有些资料参考网上写的比较好的资料,免得查找资料麻烦。旋转矩阵的坐标理解:表示从旋转矩阵的下标的坐标系的坐标变换到上标表示的坐标系坐标下。旋转矩阵的坐标系理解:表示从旋转矩阵的上标的坐标系变换到下标表示的坐标系下。从旋转矩阵的投影更好理解,比如下面旋转矩阵的第一行是左边坐标系的第一维分量在右边坐标系的投影。 阅读详情

相关推荐

PyQt5 + HFSS:给你的仿真脚本做个专属GUI界面(零基础搭建指南)

本文详细介绍了如何使用PyQt5为HFSS仿真脚本创建专属GUI界面,适合零基础用户快速上手。通过Python二次开发,实现参数可视化调整、进度实时监控等功能,大幅提升团队协作效率。文章涵盖环境配置、界面设计、HFSS集成到打包部署的全流程,是仿真工程师提升工作效率的实用指南。

weixin_42535720的博客 185

内部类引用局部变量必须为final类型

内部类引用局部变量时必须申明为final,原因有二 一:因为jvm编译后,内部类和外部类是两个独立的calss文件,两者的生命周期不一致,机局部方法所在类运行完后被销毁了,此时内部类还在运行中,会出现内部类访问一个不存在的局部变量,jvm采用在内部类中新增一个成员变量和构造函数(编译时由编译器自动生成),将外部类的局部变量赋值到本类中的成员变量,解决这个问题。 二:若不使用final修饰,会导...

qq_21932931的博客 1625

使用C++编写一个可视化窗口

初学C++时,控制台会给我们提供一个黑窗口,而这篇文章所做的就是:创建一个属于图形界面窗口,而不是使用控制台黑窗口 如图,这是一个标题为XSZY的窗口 看完这篇文章,你想要的窗口大小,图标等都可以自己定义 甚至是在窗口上鼠标的样子,都是可以随意改的 所有有关视窗的基本函数和类型都定义在头文件 <windows.h> 中 我们只需要引用就好了 //引用头文件 windows.h #include<windows.h> 然后定义程序的入口函数main int __stdcall W

XSZY_的博客 6万+

为什么java内部类访问局部变量必须声明为final?

先抛出让我疑惑了很久的一个问题 编程时,在线程中使用局部变量时候经常编译器会提示:局部变量必须声明为final package test; public class ThreadTest { public void function(String a) { new Thread(){ @Override public void run() { Syst

大树的学习之路 1万+

树莓派4B系统安装及SSH远程控制(简单易操作)

​自从2022年4月树莓派官网更新了RaspberryPiImager版本v1.7.2后,便不再支持自行建立ssh文件,并用默认用户名pi和密码raspberry的方式进行远程控制(亲测不行,输密码时一直access denied)。但是该版本软件提供了烧录系统前设置ssh用户及密码功能。本文记录了系统安装和SSH远程操作步骤。........................

机械人的代码路 5790

更换光猫的原理与方法

当你给装维打电话说你需要更换光猫时,对于装维来说,他并不需要知道怎么更换,他只需要生成一张工单,由后台进行业务操作后,在去用户家把新光猫给装好即可,此时装维到底起到了什么作用呢?我想可能只是运输员吧,把一个设备从一个地方运到另一个地方罢了,此时并不能指望装维做什么,因为本质上来说装维的能力真的很差很差,我是不知道那些装维哪来的勇气做视频,还说自己什么什么能力很强?很强吗?吹牛的技术确实很强。 更换光猫之前,需要先明白为什么要更换光猫,怎么更换光猫,更换后不能用怎么办?怎么才能更换成功,换光猫以后被限速了怎么

qq_34146290的博客 1万+

Java 局部内部类访问局部变量为什么必须加final关键字

1.疑问 在Java中,局部内部类如果调用了方法中的变量,那么该变量必须申明为final类型,如果不申明,则编译就会出错。 这里的内部类指的是方法内部类或匿名内部类,不包含静态内部类和成员内部类 这里通过一个例子类分析 public class InnerClass { private int defaultAge = 5; 局部变量 age,必须添加final关键字,这里先不加 public void addAge( int age){ //局部内部类 class Ne

专业的计算机毕业设计指南 3957

从0死磕全栈之使用 VS Code 调试 Next.js 应用完整指南

调试目标推荐方式客户端组件VS Code + Chrome 调试器(pwa-chrome中间件(Middleware)同服务端方式静态生成(SSG)逻辑需在next build时调试,建议改用dynamic路由临时测试通过合理配置 VS Code 调试器,你可以像调试普通 Node.js 或前端项目一样,高效排查 Next.js 应用中的各类问题。🐞。

weixin_44058951的博客 1159

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

https://www.cnblogs.com/hoyong/articles/11866097.html 问题: local variable S is accessed from within inner class; needs to be declared final 在内部类当中不能引用本地变量s,需要被声明为常量 相关说法: 1.在JVM中,内部类不是直接调用方法的参数,而是内部类将传进来的参数通过自己的构造器备份到了自己的内部,自己内部的方法调用的实际是自己的属性而不是外部类方法的参数。

yygr的博客 4100

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了。

吻等离子的博客 2871

Pytorch实现EdgeCNN(基于PyTorch实现)

本专栏整理了《图神经网络代码实战》,内包含了不同图神经网络的相关代码实现(PyG以及自实现),理论与实践相结合,如GCN、GAT、GraphSAGE等经典图网络,每一个代码实例都附带有完整的代码。

优快云 精品推荐 1万+

为什么java内部类访问局部变量必须声明为final

有时候在开发Java的时候会遇到:“Variable is accessed from within inner class ,need to be declared final”。 意思就是:在内部类中不能引用本地(局部)变量,需要声明为常量。 1、为什么必须声明成final 追究根本原因其实就是作用域中变量的生命周期所致 1)从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于...

GracefulGuigui的博客 1759

高项备考论文:规划绩效域

高项备考论文:规划绩效域

liuxu324的博客 1127

java内部类访问局部变量_为什么java内部类访问局部变量必须声明为final?

https://blog.csdn.net/z55887/article/details/49229491先抛出让我疑惑了很久的一个问题编程时,在线程中使用局部变量时候经常编译器会提示:局部变量必须声明为finalpackage test;public class ThreadTest {public void function(String a) {new Thread(){@Overridep...

weixin_28943105的博客 233

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

为什么java匿名内部类和局部内部类访问局部变量必须声明为final?

一、问题的发现: 当然我是在遇到这个问题之后才发现的,请看下面这个不被编译器通过的代码以及提示: Java:Cannot refer to the non-final local variable holderItemNews defined in an enclosing scope (Java:不能引用在封闭范围内定义的非最终局部变量持有者) 二、问题的分析与解决: s...

baidu_41922630的博客 460

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【面试对宝典40题的解释】为什么从内部类中访问局部变量需要被声明为final最终类型

在搞Spring时,有很多方法都用到了回调函数,因而涉及到了更多的内部类,在使用内部类时,发现从内部类中访问局部变量需要被声明为最终类型(final),有些迷惑,找了一些分析文章。如下: 这是从编译器的角度去分析的: class A{ public void shout(final int iargs){ class B{ public

Angiexia的专栏 2932

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

为什么方法体中的内部类只能访问方法中被声明为final的局部变量?

为什么方法体中的内部类只能访问方法中被声明为final的局部变量? 答:定义在方法体中的变量会随方法的退出而消亡,而final关键字可以扩展其生命周期,可与访问其类实例的生命周期相配合。 ...

Do_LaLi的博客 192

关于为什么内部类不能访问外部类方法中的局部变量,除非该变量被声明为final类型的疑问?

关于为什么内部类不能访问外部类方法中的局部变量,除非该变量被声明为final类型的疑问? 1. 这里所说的“匿名内部类”主要是指在其外部类的成员方法内定义的同时完成实例化的类,若其访问该成员方法中的局部变量,局部变量必须要被final修饰。原因是编译器实现上的困难:内部类对象的生命周期很有可能会超过局部变量的生命周期。 2. 局部变量的生命周期:当该方法被调用时,该方法中的局部变量在栈中被创建...

qq_41746482的博客 1367

匿名内部类为什么访问外部类局部变量必须是final的?

首先声明,这个是我转载的文章,但是下面的“我的理解”是个人的总结,如果觉得下面的有点长,或者看不懂可以参考一下我的理解。如果有大神觉得我的理解存在问题,可以给我留言1. 内部类里面使用外部类的局部变量时,其实就是内部类的对象在使用它,内部类对象生命周期中都可能调用它,而内部类试图访问外部方法中的局部变量时,外部方法的局部变量很可能已经不存在了,那么就得延续其生命,拷贝到内部类中,而拷贝会带来不一致...

qq_41841298的博客 253

局部内部类访问外部类的局部变量要求该变量为final类型

局部内部类访问外部类的局部变量要求该变量为final类型。方法的局部变量位于栈上,对象位于堆上。因为局部变量的范围被限制在该方法内,当一个方法结束时,栈结构被删除,该变量消失。但是,定义在这个类中的内部类对象仍然存活在堆上,所以内部类对象不能使用局部变量。除非这些局部变量被标识为final的。

koko7958的专栏 607

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

大部分时候,类被定义成一个独立的程序单元。在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,包含内部类的类也被称为外部类。    class Outer { private int a; public class Inner { private int a; public void meth

u014227831的专栏 5103

内部类使用final外部变量

内部类访问局部变量的时候,变量必须加上final修饰。局部变量在所处的函数执行完之后就释放了,但是内部类对象如果还有引用指向的话它是还存在的。(不管变量是不是final,他的生命周期都在于{}中), class Outer{ public

fengxiaotao_cool的专栏 343

为什么匿名内部类调用的方法内局部变量必须为final

Why inner classes require “final” outer instance variables ?      finalJTextFieldjtfContent =newJTextField();     btnOK.addActionListener(newjava.awt.event.ActionListener(){         publicvoid

scyatcs的专栏 1819
上一篇: 如何禁止访问某网站
下一篇: 如何在Eclipse中查看JDK源码?
KeepThinking_
博客等级 码龄15年 50粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值