Java——变量作用域和生命周期
一、作用域
1、作用域简介
在Java中,作用域(Scope)指的是变量、方法和类在代码中的可见性和生命周期。理解作用域有助于编写更清晰、更高效的代码。
2、作用域
块作用域(Block Scope):
块作用域是指在大括号 {}
内定义的变量的作用域。变量只在其定义的块内可见和有效,包括循环、条件语句和代码块。
方法作用域(Method Scope):
方法作用域指的是在方法内定义的变量的作用域。变量在整个方法内可见和有效。
类作用域(Class Scope):
类作用域指的是在类中定义的成员变量的作用域。成员变量在整个类内可见和有效。
二、全局变量和局部变量
1、全局变量
全局变量在Java中通常指的是类级别变量,或者说是类的属性。包括实例变量和静态变量。这些变量的作用域在整个类内,它们可以在类的所有方法中访问和修改。
1)实例变量
实例变量是类的非静态成员变量。它们属于类的每个实例,每个实例都有自己的一份实例变量。实例变量也是全局变量,在这个类的每一个方法中都能访问:
class Person {//全局变量,类的属性String name;int age;//构造方法public Person(String name, int age) {this.name = name;//在每个方法中都能访问到这个全局变量this.age = age;//在每个方法中都能访问到这个全局变量}//获取年龄public int getAge() {return age;//在每个方法中都能访问到这个全局变量}//设置年龄public void setAge(int age) {this.age = age;//在每个方法中都能访问到这个全局变量}//获取名字public String getName() {return name;//在每个方法中都能访问到这个全局变量}//设置名字public void setName(String name) {this.name = name;//在每个方法中都能访问到这个全局变量}
}
可以看到这里的属性或者说是全局变量在这个类的每一个方法中都能访问到。
2)静态变量
静态变量是使用static
关键字声明的类变量。它们属于整个类,而不是任何特定实例。所有实例共享同一个静态变量。类的静态变量在这个类的每一个方法中都能访问:
public class MyClass {// 静态变量private static int staticVariable = 0;public MyClass() {staticVariable++;}public void printStaticVariable() {System.out.println(staticVariable);}
}public class Main {public static void main(String[] args) {MyClass obj1 = new MyClass();MyClass obj2 = new MyClass();obj1.printStaticVariable(); // 输出:2obj2.printStaticVariable(); // 输出:2}
}
2、局部变量
局部变量是在方法、构造函数或块中声明的变量。它们的作用域仅限于声明它们的方法、构造函数或块内,方法或块的执行结束后,局部变量将被销毁。
public class MyClass {public void myMethod() {// 局部变量int localVar = 100;System.out.println(localVar);}
}public class Main {public static void main(String[] args) {MyClass obj = new MyClass();obj.myMethod(); // 输出:100// System.out.println(localVar); // 错误,localVar在myMethod方法完成调用后就会被销毁}
}
这里就体现了对于定义在某个方法内的局部变量在方法调用结束后,就会被销毁。
class Cat {int age;//猫叫方法public void mewing() {String mew = "Mewing~";//这个mew就是局部变量,在mewing方法中定义,只能在mewing方法中使用System.out.println(mew);}//吃东西方法public void eat() {//System.out.println(mew);//在这里使用mewing方法中的局部变量mew是错误的//对于mew这个局部变量只能在mewing这个方法中使用//...}
}
这段代码体现了,定义在某个方法中的局部变量,只能在这个方法中使用,不能在其他方法中使用。
三、补充细节
1、全局变量和局部变量的赋值
全局变量可以不赋值,直接使用,因为它们有默认赋值,但是对于局部变量不赋值(不初始化)是不能使用的。
未初始化的全局变量:
public class Test {public static void main(String[] args) {Example example = new Example();example.foo();}
}class Example {int a;//未赋值(未初始化)的全局变量,会被默认初始化为这个类型的默认值public void foo() {System.out.println(a);//使用这个未初始化的全局变量,它的值是默认值}
}
运行结果:
未初始化的局部变量:
public class Test {public static void main(String[] args) {Example example = new Example();example.foo();}
}class Example {public void foo() {int a;//未赋值(未初始化)的局部变量System.out.println(a);//使用这个未初始化的局部变量,会报错}
}
运行结果:
2、全局变量和局部变量可以重名
在Java中,全局变量(类级别变量,包括实例变量和静态变量)和局部变量(方法、构造函数或块内声明的变量)是可以重名的,在访问时,遵循就近原则。尽管如此,这样做可能会导致代码混淆和难以维护,因此通常建议避免这种做法。
例如:
public class Test {public static void main(String[] args) {Example example = new Example();example.foo();}
}class Example {int a = 6;public void foo() {int a = 16;System.out.println(a);//就近原则,会使用foo方法内的变量a}
}
运行结果:
可以发现全局变量和局部变量是可以重名的,在使用时遵循就近原则。
3、同一个作用域内不能重名
在同一个作用域中不能重名,例如在同一个方法中不能定义同名的变量,即使是不同类型同名也不行。
public void foo() {int a = 16;double a = 0.0;}
这里就会报错:
4、局部变量只能用final修饰符
对于全局变量可以使用所有修饰符,但是对于局部变量就只能使用final这个修饰符,其他的都能用。
全局变量修饰符使用情况:
全局变量包括实例变量和静态变量,它们可以使用各种修饰符来指定访问权限、状态和其他特性。常用的修饰符有:
-
访问修饰符:
public
: 变量可以被所有类访问。protected
: 变量可以被同一包中的类和子类访问。private
: 变量只能被声明它的类访问。- 默认(无修饰符): 变量只能被同一包中的类访问。
-
状态修饰符:
static
: 将变量定义为类变量,共享给所有实例。final
: 将变量定义为常量,初始化后不能修改。transient
: 序列化时忽略该变量。volatile
: 提示线程对该变量的修改操作是可见的,多线程环境中保证变量的可见性。
局部变量修饰符修饰符使用情况:
局部变量包括方法内部、构造函数内部或代码块内部定义的变量。局部变量的作用范围仅在其声明的块内。局部变量只能使用final
修饰符。
class Example {public void foo() {final int num = 0;//使用final修饰符修饰,表示这个局部变量的值不能再被改变}
}
与全局变量不同,局部变量不能使用访问控制修饰符(如 public
、protected
、private
)和一些状态修饰符(如 static
、transient
、volatile
)。
class Example {public void foo() {public int a = 0;private int b = 0;protected int c = 0;static int d = 0;transient int e = 0;volatile int f = 0;}
}
这里就会报错:
四、变量的生命周期
在Java中,变量的生命周期决定了变量存在的时间范围。根据变量的类型和定义位置,可以将Java中的变量分为以下几类:局部变量、全局变量(包括实例变量和静态变量)。下面详细介绍每种变量的生命周期及特点。
1、局部变量生命周期
当局部变量所在的方法被调用时,局部变量的生命周期从它们声明开始,到包含它们的块(方法、构造函数、代码块等)结束。当方法、构造函数或代码块执行完毕后,局部变量将不再存在,内存也将被释放。
局部变量存储在栈区中。
2、全局变量生命周期
1)实例变量生命周期
实例变量的生命周期从创建对象(调用构造函数)开始,到这个对象被垃圾回收器回收时结束。实例变量在对象存在期间都可以访问。
实例变量存储在堆区中。
2)静态变量生命周期
静态变量的生命周期从类加载时开始,到类卸载时结束。静态变量在整个程序运行期间都存在,直到JVM结束。
静态变量存储在方法区(Method Area)中。
相关文章:
Java——变量作用域和生命周期
一、作用域 1、作用域简介 在Java中,作用域(Scope)指的是变量、方法和类在代码中的可见性和生命周期。理解作用域有助于编写更清晰、更高效的代码。 2、作用域 块作用域(Block Scope): 块作用域是指在…...
WPF界面设计
1、使用C#-WPF实现抽屉效果-炫酷漂亮的侧边栏导航菜单-SplitViewMD主题重绘原生控件的美观效果-提供源码Demo下载 码源地址:https://download.csdn.net/download/Prince999999/89424685 2、使用C#-WPF实现抽屉效果-菜单导航功能实现,常规的管理系统应该…...
【C#】使用JavaScriptSerializer序列化对象
在C#开发语言编程中,通常使用系统内置的JavaScriptSerializer类来序列化对象,以便将其转换为JSON格式的文本存储与后台服务通信, 在这里将为大家详细介绍一下这个过程。 文章目录 反序列化序列化忽略属性 假设处理的数据中有一个对象类, 如下 public cl…...
HTML静态网页成品作业(HTML+CSS)—— 明星吴磊介绍网页(5个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…...
EasyRecovery2024数据恢复神器#电脑必备良品
EasyRecovery数据恢复软件,让你的数据重见天日! 大家好!今天我要给大家种草一个非常实用的软件——EasyRecovery数据恢复软件!你是不是也曾经遇到过不小心删除了重要的文件,或者电脑突然崩溃导致数据丢失的尴尬情况呢&…...
前端HTML相关知识
1.什么是HTML HTML 指的是超文本标记语言 ( HyperText Markup Language )。 超文本:是指页面内可以包含图片、链接、声音,视频等内容 标记:标签(通过标记符号来告诉浏览器网页内容该如何显示) 浏览器根据不同的HTML标签,解析成我们看到的网页 2.HTML的特点 HTML不…...
集合面试题
目录 ①HashMap的理解?以及为什么要把链表转换为红黑树?②HashMap的put?③HashMap的扩容?④加载因子为什么是0.75?⑤modcount的作用?⑥HashMap与HashTable的区别?⑥HashMap中1.7和1.8的区别&am…...
集成学习概述
概述 集成学习(Ensemble learning)就是将多个机器学习模型组合起来,共同工作以达到优化算法的目的。具体来讲,集成学习可以通过多个学习器相结合,来获得比单一学习器更优越的泛化性能。集成学习的一般步骤为:1.生产一组“个体学习…...
记录一次root过程
设备: Redmi k40s 第一步, 解锁BL(会重置手机系统!!!所有数据都会没有!!!) 由于更新了澎湃OS系统, 解锁BL很麻烦, 需要社区5级以上还要答题。 但是,这个手机…...
函数(上)(C语言)
函数(上) 一. 函数的概念二. 函数的使用1. 库函数和自定义函数(1) 库函数(2) 自定义函数的形式 2. 形参和实参3. return语句4. 数组做函数参数 一. 函数的概念 数学中我们其实就见过函数的概念,比如:一次函数ykxb,k和b都是常数&a…...
ARM-V9 RME(Realm Management Extension)系统架构之系统安全能力的侧信道抵御
安全之安全(security)博客目录导读 目录 一、系统PMU计数器 二、使用信号和功耗操作进行的故障攻击 一、系统PMU计数器 性能监测单元 (PMU) 计数器可能成为泄露机密信息的侧信道,如访问模式或受RME安全保障保护的安全状态下的执行控制流。以下规则补充了《Arm CoreSight™…...
Java高级技术探索:深入理解JVM内存分区与GC机制
文章目录 引言JVM内存分区概览垃圾回收机制(GC)GC算法基础常见垃圾回收器ParNew /Serial old 收集器运行示意图 优化实践结语 引言 Java作为一门广泛应用于企业级开发的编程语言,其背后的Java虚拟机(JVM)扮演着至关重…...
新视野大学英语2 词组 6.15
do you feel as confused and manipulated as i do with this question 你是否和我一样,对这个问题感到困惑和被操控 manipulated:被操控 defy common sense and contradict each other 违背常识且相互矛盾 defy:违背 contradict…...
【JavaScript】MDN
一、初识 1.1 基础 1.1.1 语言速成课 1.1.1.1 变量 变量是存储值的容器。首先用let关键字声明一个变量,后面跟着你给变量的名字 变量命名区分大小写 分号在JavaScript中是用来分隔语句的,但是如果语句后面有一个换行符(或者在{block}中只…...
Qt/C++中的异步编程
Qt/C++中的异步编程 1 介绍2 含义2.1 QtConcurrent2.2 std::future2.3 Qml中的Promise3 使用场景4 代码示例5 注意事项5.1异常处理5.2 线程安全5.3 性能优化5.4 线程间通信5.5 避免死锁1 介绍 异步编程是现代应用程序开发中不可或缺的一部分。它允许程序在执行耗时任务时保持响…...
解决javadoc一直找不到路径的问题
解决javadoc一直找不到路径的问题 出现以上问题就是我们在下载jdk的时候一些运行程序安装在C:\Program Files\Common Files\Oracle\Java\javapath下: 一开始是没有javadoc.exe文件的,我们只需要从jdk的bin目录下找到复制到这个里面,就可以使用…...
存储器的性能指标以及层次化存储器
存储器的性能指标 存储器有三个性能指标:速度、容量和位价(每位价格) 1.存储速度 (1)存取时间 想衡量存储速度,最直观的指标就是完成一次存储器读写操作所需要的时间,这叫做存取时间&#x…...
【C++】C++入门的杂碎知识点
思维导图大纲: namespac命名空间 什么是namespace命名空间namespace命名空间有什么用 什么是命名空间 namespace命名空间是一种域,它可以将内部的成员隔绝起来。举个例子,我们都知道有全局变量和局部变量,全局变量存在于全局域…...
springboot 整合redis问题,缓存击穿,穿透,雪崩,分布式锁
boot整合redis 压力测试出现失败 解决方案 排除lettuce 使用jedis <!-- 引入redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclus…...
免费个人站 独立站 wordpress 自建网站
制作免费网站 | 免费网站构建器 | WordPress.com https://bioinformatics7.wordpress.com WordPress.com...
散列函数的基本概念
散列函数 算法不能设计太过复杂 太复杂的散列函数,势必会消耗很多计算时间 散列函数生成的值要尽可能随机并且均匀分布 这样才能避免或者最小化散列冲突而且即便出现来冲突,散列到每个槽里的数据也会比较平均,不会出现某个槽内数据特别多…...
【C++拷贝构造函数深浅拷贝】
拷贝构造函数 注意:访问权限是public 拷贝构造函数:类名(const 类名& 对象名){} 可以有多个参数 。 没有常引用就是普通构造函数 如果不写,编译器自己会给一个(作用仅仅是赋值,默认拷…...
快速编译安装tensorrt_yolo
快速编译安装 安装 tensorrt_yolo 通过 PyPI 安装 tensorrt_yolo 模块,您只需执行以下命令即可: pip install -U tensorrt_yolo 如果您希望获取最新的开发版本或者为项目做出贡献,可以按照以下步骤从 GitHub 克隆代码库并安装: …...
外盘黄金期货需要注意什么?
为大家整理了关于黄金做单的五大原则,相信对于新手投资者来说肯定会产生一定的帮助。 1、看多空:主要有两种方法,基本面判断和技术面判断,基本面判断,主要是借助基本信息面,如政策。供需,产量…...
Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包
Allegro光绘Gerber文件、IPC网表、坐标文件、装配PDF文件导出打包 一、Gerber文件层叠与参数设置二、装配图文件设置导出三、光绘参数设置四、Gerber孔符图、钻孔表及钻孔文件输出五、输出Gerber文件六、输出IPC网表七、导出坐标文件八、文件打包 一、Gerber文件层叠与参数设置…...
mysql的索引可以分为哪些类型
MySQL的索引是用于提高查询性能的重要数据结构。不同类型的索引在不同的使用场景中具有不同的优势和适用性。 1. 主键索引(Primary Key Index) 特点:唯一且不允许 NULL 值。用途:唯一标识表中的每一行。自动创建:定义…...
Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported
Content type application/x-www-form-urlencoded;charsetUTF-8 not supported 问题背景新增页面代码改造 问题背景 这里有一个需求,前端页面需要往后端传参,参数包括主表数据字段以及子表数据字段,由于主表与子表为一对多关系,在…...
【JavaEE进阶】——利用框架完成功能全面的图书管理系统
目录 🚩项目所需要的技术栈 🚩项目准备工作 🎈环境准备 🎈数据库准备 🚩前后端交互分析 🎈登录 📝前后端交互 📝实现服务器代码 📝测试前后端代码是否正确 &am…...
WDF驱动开发-内存缓冲区
驱动程序通常使用内存缓冲区向/从框架和其他驱动程序传递数据,或在本地存储信息。 WDF常见的内存缓冲区包括框架内存对象(WDFMEMORY)、 lookaside、 MDL 和 本地缓冲区。 使用框架内存对象 框架使用 内存对象 来描述驱动程序从中接收并传递给框架的内存缓冲区。 每…...
c语言连接两个字符串
在C语言中,连接两个字符串可以使用 strcat 函数。这个函数将一个字符串复制到另一个字符串的末尾。使用 strcat 函数之前,需要确保目标字符串有足够的空间来容纳源字符串,否则可能会导致缓冲区溢出。 下面是一个使用 strcat 函数连接两个字符…...
wordpress修改固定连接404/宁波如何做seo排名优化
1.重启之前最好先看一下节点信息和运行状态 可以通过srvctl status database -d 数据库名 //查看节点信息 Crs_stat //查看节点状态 可以看到数据节点它由两个实例组成一个数据库,分别运行不同的节点,且状态ok 2.首先关闭数据库 Srvctl stop database -d…...
网站建设管理意见/谷歌浏览器下载视频
在Windows系统的云虚拟主机内访问站点时,提示如下错误。 问题原因 由于当前服务器为Windows操作系统,但是Windows操作系统不支持PHP脚本语言。 解决方案 Linux操作系统支持PHP语言,可以考虑将云虚拟主机更换为Linux操作系统...
wordpress 登陆链接/如何进入网站
缘起 随着互联网企业的不断发展,产品项目中的模块越来越多,用户体验要求也越来越高,想实现小步快跑、快速迭代的目的越来越难,还有65535,应用之间的互相调用等等问题,插件化技术应用而生。如果没有插件化技…...
佛山网站设计怎么做/短信营销
拒绝重复劳动.保存如下代码为codeGen.py,放到模块统计目录下 import sysname sys.argv[1] verbose sys.argv[2]def underscore(str):return "".join(map(lambda x: "_" x if x.isupper() else x, str))[1:].lower()model ""&quo…...
暴雪战网官方网站入口/网站快速优化排名推荐
Jquery on("click") 方法绑定事件后执行多次解决办法参考文章: (1)Jquery on("click") 方法绑定事件后执行多次解决办法 (2)https://www.cnblogs.com/yangsoon/p/6593021.html 备忘一下。...
河北邯郸网站建设公司/厦门seo排名优化
装饰器系列: [1]. Python装饰器(decorator)系列 — 面向对象以及装饰器 [2]. Python装饰器(decorator)系列 — 编写无参数的装饰器 [3]. Python装饰器(decorator)系列 — 编写带参数的装饰器 类(class):是对现实世界中一些事物的封装 类中包含类的属性和…...