【转】从内部类中访问本地变量temp; 需要被声明为最终类型

2024-02-20 06:18

本文主要是介绍【转】从内部类中访问本地变量temp; 需要被声明为最终类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42097653/article/details/80675085

-----------------------------------------------------------------------------------------------------------------------------

class Outer{        // 定义外部类private String info = "hello world" ;   // 定义外部类的私有属性public void fun(final int temp){        // 定义外部类的方法class Inner{                        // 在方法中定义的内部类public void print(){                // 定义内部类的方法System.out.println("类中的属性:" + info) ;       // 直接访问外部类的私有属性System.out.println("方法中的参数:" + temp) ;}};new Inner().print() ;               // 通过内部类的实例化对象调用方法}
};
public class InnerClassDemo05{public static void main(String args[]){new Outer().fun(30) ;   // 调用外部类的方法}
};


定义在成员位置处的类为成员内部类,而定义在局部位置处的类为局部内部类。

当内部类访问外部类的局部变量或者外部方法的局部变量/函数参数时,需要将该变量声明为最终类型。
System.out.println("方法中的参数:" + temp) ;
temp是外部方法的函数形参,那么这个参数就需要声明为最终类型。


为什么呢???

是因为fun(30)函数被调用后,函数参数等就会被内存机制回收,因为他们是被分配到栈中的。而内部类的对象是在堆中分配内存的,外部方法调用结束后该内部类对象不一定就被销毁了;所以就会出现一个奇怪的现象:内部类对象在访问一个不存在的局部变量。
这时候,用状态修饰符final修饰该变量,从而该变量成了常量,解决了这个问题。

本质: 局部变量的生命周期与局部内部类的对象的生命周期的不一致性.

参考(致谢):
https://www.cnblogs.com/ioveNature/p/7011204.html
https://blog.csdn.net/seashine_yan/article/details/67637941
————————————————
版权声明:本文为CSDN博主「thjstar」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_42097653/article/details/80675085

 

这篇关于【转】从内部类中访问本地变量temp; 需要被声明为最终类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/727288

相关文章

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

关于Java内存访问重排序的研究

《关于Java内存访问重排序的研究》文章主要介绍了重排序现象及其在多线程编程中的影响,包括内存可见性问题和Java内存模型中对重排序的规则... 目录什么是重排序重排序图解重排序实验as-if-serial语义内存访问重排序与内存可见性内存访问重排序与Java内存模型重排序示意表内存屏障内存屏障示意表Int

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Redis的Hash类型及相关命令小结

《Redis的Hash类型及相关命令小结》edisHash是一种数据结构,用于存储字段和值的映射关系,本文就来介绍一下Redis的Hash类型及相关命令小结,具有一定的参考价值,感兴趣的可以了解一下... 目录HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGETHLENHSET

SpringBoot如何访问jsp页面

《SpringBoot如何访问jsp页面》本文介绍了如何在SpringBoot项目中进行Web开发,包括创建项目、配置文件、添加依赖、控制层修改、测试效果以及在IDEA中进行配置的详细步骤... 目录SpringBoot如何访问JSP页python面简介实现步骤1. 首先创建的项目一定要是web项目2. 在

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

Perl 特殊变量详解

《Perl特殊变量详解》Perl语言中包含了许多特殊变量,这些变量在Perl程序的执行过程中扮演着重要的角色,:本文主要介绍Perl特殊变量,需要的朋友可以参考下... perl 特殊变量Perl 语言中包含了许多特殊变量,这些变量在 Perl 程序的执行过程中扮演着重要的角色。特殊变量通常用于存储程序的