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修饰符修饰,表示这个局部变量的值不能再被改变}
}

与全局变量不同,局部变量不能使用访问控制修饰符(如 publicprotectedprivate)和一些状态修饰符(如 statictransientvolatile)。

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)中。

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

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

相关文章

软考中级|软件设计师-知识点整理

目录 计算机网络概论 计算机系统基础知识 中央处理单元 数据表示 校验码 计算机体系结构 计算机体系结构的发展 存储系统 输入/输出技术 安全性、可靠性与系统性能评测基础知识 加密技术和认证技术 计算机可靠性 程序设计语言基础知识 程序设计语言概述 程序设计…

微信同声传译小程序插件使用教程

微信同声传译小程序插件 —— 机器翻译、智能语音 案例可搜索“一起学英语鸭”小程序查看, 实现效果如下图: 插件功能 语音转文字 语音合成 文本翻译 step 1:添加插件 在使用前,需要登录官网 设置 → 第三方服务 → 添加插件…

Hadoop的读写流程

Hadoop分布式文件系统(HDFS)是Apache Hadoop项目的核心组件,它为大数据存储提供了一个可靠、可扩展的存储解决方案。本文将详细介绍HDFS的读写数据流程,包括数据的存储原理、读写过程以及优化策略。 一、HDFS简介 HDFS是一个高度容错的分布式文件系统,它设计用于运行在通…

AI探索:最佳落地应用场景

如果说今年的风口,那一定是 AI。不过AI像一把双刃剑,既有助益也有风险。我们将从IBM Watson的高飞与坠落,到Google Allo的黯然失色,探索AI应用中的教训。同时,瑞幸咖啡的成功故事展现了凭借策略得当的AI应用&#xff0…

2024年【安全员-C证】考试资料及安全员-C证找解析

题库来源:安全生产模拟考试一点通公众号小程序 安全员-C证考试资料根据新安全员-C证考试大纲要求,安全生产模拟考试一点通将安全员-C证模拟考试试题进行汇编,组成一套安全员-C证全真模拟考试试题,学员可通过安全员-C证找解析全真…

探索AI创新的前沿——从零开始学习和运用SpringAI

1.SpringAI介绍 SpringAI是AI工程师的一个应用框架,它提供了一个友好的API和开发AI应用的抽象,旨在简化AI应用的开发工序。 目标是将可移植性和模块化设计等设计原则应用于AI领域的Spring生态系统,并将POJO作为应用程序的构建块推广到AI领域…

浅谈赚钱的四个级别,你在哪一层呢

一谈到赚钱,很多人都会扯到:智商、情商、人脉、资源、背景等等,类似“小钱靠勤,中钱靠智,大钱靠德”这样的经典语录都会脱口而出,其实从本质上来讲,都没有错,但这样的说法太缥缈&…

mysql-connector下载教程(手把手)

下载一个第三方库主要有三种途径: 去官方网站 Oracle 官网去github去Maven中央仓库 前两个方法比较麻烦,你还需要去找。 这里就只介绍maven的方法 Maven类似于手机app的应用商店。 操作步骤: 点击右边进入官网Maven中央仓库 在搜索框中…

k8s+pv+pvc+nas 数据持久化volumes使用

1 k8s pod申请持久化卷配置 apiVersion: v1 kind: Service metadata:name: $IMG_NAMEnamespace: rz-dtlabels:app: $IMG_NAME spec:type: NodePortports:- port: 8091nodePort: 31082 #service对外开放端口selector:app: $IMG_NAME --- apiVersion: apps/v1 kind: Deployment …

FineReport简单介绍(2)

一、报表类型 模板设计是 FineReport 学习过程中的主要难题所在,FineReport 模板设计主要包括普通报表、聚合报表、决策报表三种设计类型。 报表类型简介- FineReport帮助文档 - 全面的报表使用教程和学习资料 二、聚合报表 2-1 介绍 聚合报表指一个报表中包含多个…

机器学习笔记 - 用于3D点云数据分割的Point Net的训练

一、数据集简述 ​在本教程中,我们将学习如何在斯坦福 3D 室内场景数据集 ( S3DIS )上训练 Point Net 进行语义分割。S3DIS 是一个 3D 数据集,包含来自多栋建筑的室内空间点云,占地面积超过 6000 平方米。Point Net使用整个点云,能够执行分类和分割任务。如果你一直在关注 …

openstack搭建

openstack搭建 1、虚拟机部署规划 主机主机名IP规划实例通讯内部通讯控制节点controller192.168.10.144192.168.1.144实例节点compute192.168.10.145192.168.1.145 2、硬件配置 主机名内存逻辑CPU数量硬盘容量controller4G480Gcompute4G480G20G 3、安装centos7&#xff0c…

Science:如何快速完成一篇研究性论文?

我是娜姐 迪娜学姐 ,一个SCI医学期刊编辑,探索用AI工具提效论文写作和发表。 完成一篇研究性论文,是将长时间积累的研究成果凝聚在几页纸中,对资深科学家而言也是一大挑战。作者们需要在充分论述科学问题和详细展示结果之间找到平…

javaweb 期末复习

1. JDBC数据库连接的实现逻辑与步骤以及JDBC连接配置(单列模式) public class JDBCUtil {// 这些换成自己的数据库 private static final String DB_URL "jdbc:mysql://localhost:3306/你的数据库名称";private static final String USER &q…

linux中批量给文件改名

rename 需要批量将文件名前的UC-10_取消掉,以数字来命名文件 rename s/UC-10_// *.jpg 修改成功 要是修改为其他名字需要在单引号的第二个/后加字符即可 例如要改为li

基于 SSM 框架的二手书交易系统

基于 SSM 框架的二手书交易系统 一、项目介绍二、项目技术栈三、项目运行四、项目演示总结 大家好,这里是程序猿代码之路。在当今环保意识日益增强和资源节约型社会建设的背景下,二手交易作为一种节省资源和降低成本的消费方式越来越受到人们的欢迎。特别…

基于Java和SSM框架的多人命题系统

你好呀,我是计算机学长猫哥!如果你对多人命题系统感兴趣或者有相关开发需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:Java SSM框架 工具:Eclipse、MySQL Workbench、…

C++全栈聊天项目(22) 气泡聊天对话框

气泡聊天框设计 我们期待实现如下绿色的气泡对话框 对于我们自己发出的信息,我们可以实现这样一个网格布局管理 NameLabel用来显示用户的名字,Bubble用来显示聊天信息,Spacer是个弹簧,保证将NameLabel,IconLabel,Bubb…

Java小结

# Java的特点 Java是一门面向对象的编程语言。面向对象和面向过程的区别参考下一个问题。 Java具有平台独立性和移植性。 Java有一句口号:Write once, run anywhere,一次编写、到处运行。这也是Java的魅力所在。而实现这种特性的正是Java虚拟机JVM。已…

Hvv--知攻善防应急响应靶机--Linux1

HW–应急响应靶机–Linux1 所有靶机均来自 知攻善防实验室 靶机整理: 夸克网盘:https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘:https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP:https://mp.weixin.…