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(); // 输出:2
        obj2.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)中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何解决mfc100u.dll丢失问题,关于mfc100u.dll丢失的多种解决方法

在计算机使用过程中,我们常常会遇到一些错误提示,其中之一就是“计算显示缺失mfc100u.dll”。这个问题可能会影响到我们的正常使用,因此了解它的原因、表现以及解决方法是非常重要的。小编将详细介绍计算显示缺失mfc100u.dll的问题&#xff0…

区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现BP-ABKDE的BP神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BP-ABKDE的BP神经网络自适应带…

java安装并配置环境

安装前请确保本机没有java的残留,否则将会安装报错 1.安装java jdk:安装路径Java Downloads | Oracle 中国 百度网盘链接:https://pan.baidu.com/s/11-3f2QEquIG3JYw4syklmQ 提取码:518e 2.双击 按照流程直接点击下一步&#x…

个人网站制作 Part 25 添加实时聊天功能 | Web开发项目添加页面缓存

文章目录 👩‍💻 基础Web开发练手项目系列:个人网站制作🚀 添加实时聊天功能🔨使用聊天服务🔧步骤 1: 选择聊天服务🔧步骤 2: 安装Socket.io🔧步骤 3: 创建Socket.io服务器 &#x1…

基于flask的网站如何使用https加密通信-问题记录

文章目录 项目场景:问题1问题描述原因分析解决步骤解决方案 问题2问题描述原因分析解决方案 参考文章 项目场景: 项目场景:基于flask的网站使用https加密通信一文中遇到的问题记录 问题1 问题描述 使用下面的命令生成自签名的SSL/TLS证书和…

【Apache Doris】周FAQ集锦:第 6 期

【Apache Doris】周FAQ集锦:第 6 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…

【实践功能记录6】表格列悬浮展示tooltip信息

需求描述&#xff1a; 鼠标悬浮在表格的IP字段上时&#xff0c;使用tooltip展示IP信息&#xff0c;如图&#xff1a; 1.封装根据IP展示信息的组件 请求接口获取IP信息&#xff0c;注意请求接口时防抖 <!-- 根据IP展示资产信息 --> <template><div><el-…

谷歌重塑Transformer:无限记忆力,无限长输入,登上Nature

Infini-attention机制为Transformer在具有挑战性的长语境任务中释放出了新的能力&#xff0c;对于调整现有模型以适应长输入也非常实用。 谷歌的最新研究成果Infini-attention机制&#xff08;无限长注意力&#xff09;将内存压缩引入了传统注意力机制&#xff0c;并在单个Tra…

视图-什么是(VIEW)?怎么创建(CREATE VIEW)?怎么删除(DROP)?怎么用(SELECT/INSERT/UPDATE/DELETE)?

一、引言 之前对数据库的操作都是针对基本关系表&#xff0c;操作都是在数据库的全局逻辑模式上进行的&#xff0c;而在实际的数据库系统中&#xff0c;可能用户只关心或只被允许使用数据库中的某些基本关系表或基本关系表中的某些属性列&#xff0c;这些数据构成了数据库的外…

短视频文案素材哪里找?推荐几个既好看又好用的素材网站

我们在做短视频的同时&#xff0c;一般需要一些视频&#xff0c;文案&#xff0c;图片&#xff0c;音频&#xff0c;来添加短视频的突出点&#xff0c;那么这些短视频文案去哪里找呢? 蛙学网 想要做出容易上热门的短视频文案&#xff0c;你一定要找到合适的短视频素材&#…

鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS

1、LFS文件系统结构体介绍 会分2部分来介绍结构体部分&#xff0c;先介绍LittleFS文件系统的结构体&#xff0c;然后介绍LiteOS-M内核中提供的和LittleFS相关的一些结构体。 1.1 LittleFS的枚举结构体 在openharmony/third_party/littlefs/lfs.h头文件中定义LittleFS的枚举、…

【人工智能】开发AI可能获刑?加州1047草案详解

引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其应用领域不断扩展&#xff0c;但同时也引发了诸多争议和监管问题。近期&#xff0c;加州参议院以32比1的压倒性投票通过了1047号草案&#xff0c;又称《前沿人工智能模型安全可靠创新法案》。这一草案…

贪心算法学习四

例题一 解法&#xff08;暴⼒解法 -> 贪⼼&#xff09;&#xff1a; 暴⼒解法&#xff1a; a. 依次枚举所有的起点&#xff1b; b. 从起点开始&#xff0c;模拟⼀遍加油的流程 贪⼼优化&#xff1a; 我们发现&#xff0c;当从 i 位置出发&#xff0c;⾛了 step 步…

【七合一】字典词典成语古诗词造句英语单词文库

帝国CMS7.5 UTF-8 系统开源&#xff0c;不限域名 采用静态伪静态&#xff08;会缓存静态文件&#xff09; 一款7合一的字词句诗典籍模板&#xff0c;包含字典、词典、成语、名句、诗词、古籍、英语、作文、等等。是一款养站神器。 作文范文,作文范文可生成word文档下载能自由…

Ubuntu server 24 (Linux) 安装部署samba服务器 共享文件目录 windows访问

1 安装 sudo apt update sudo apt-get install samba #启动服务 sudo systemctl restart smbd.service sudo systemctl enable smbd.service #查看服务 2 创建用户 #创建系统用户 sudo useradd test2 #配置用户密码 sudo smbpasswd -a test2 # smbpasswd: -a添加用户 …

408数据结构-图的遍历 自学知识点整理

前置知识&#xff1a;图的存储与基本操作 图的遍历是指从图的某一顶点出发&#xff0c;按照某种搜索方法沿着图中的边对图中的所有顶点访问一次&#xff0c;且仅访问一次。因为树是一种特殊的图&#xff0c;所以树的遍历实际上也可以视为一种特殊的图的遍历。图的遍历算法是求解…

【Apache Doris】Compaction 原理 | 实践全析

【Apache Doris】Compaction 原理 | 实践全析 一、Compaction 前文概要二、Compaction 版本策略三、Compaction 类型说明四、Compaction 工程实现五、Compaction 生产实践 作者 &#xff5c; 俞剑波 一、Compaction 前文概要 LSM-Tree 简介 LSM-Tree&#xff08; Log Structu…

为什么笔记本电脑触控板不工作?这里有你想要的答案和解决办法

序言 你的笔记本电脑触控板停止工作了吗?值得庆幸的是,这个令人沮丧的问题通常很容易解决。以下是笔记本电脑触控板问题的最常见原因和修复方法。 触控板被功能键禁用 大多数(如果不是全部的话)Windows笔记本电脑都将其中一个功能键用于禁用和启用笔记本电脑触控板。按键…

Type-C接口显示器:C口高效连接与无限可能 LDR

Type-C显示器C接口的未来&#xff1a;高效连接与无限可能 随着科技的飞速发展&#xff0c;我们的日常生活和工作中对于高效、便捷的连接方式的需求日益增加。在这样的背景下&#xff0c;Type-C接口显示器凭借其卓越的性能和广泛的兼容性&#xff0c;正逐渐崭露头角&#xff0c…

永磁同步直线电机(PMLSM)控制与仿真1-永磁同步直线电机数学模型

文章目录 1、引言2、永磁同步直线电机数学模型2.1 直线电机的结构和工作原理2.2 永磁同步直线电机系统干扰分析2.2.1 齿槽效应2.2.2 端部效应 2.3 永磁同步直线电机的结构2.4 永磁同步直线电机的数学模型2.4.1 ABC坐标系下 PMLSM 的数学模型2.4.2 dq坐标系下 PMLSM 的数学模型2…