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...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...

算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
引言 在嵌入式系统中,用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例,介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单,执行相应操作,并提供平滑的滚动动画效果。 本文设计了一个…...