Java——变量作用域和生命周期

news2024/11/24 6:24:55

一、作用域

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

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

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

相关文章

SQLserver前五讲课堂笔记

第一讲 基本内容 为什么要学习数据库系统?什么是数据库?什么是数据库系统?什么是数据库管理系统?本课程学什么以及学到什么程度? 重点难点 一组概念的区分:数据库、数据库系统和数据库管理系统熟悉表 的相关要素及术语熟悉数据库系统的构成(工作…

Springboot项目ES报异常query_shard_exception

详细异常信息如下: {"error": {"root_cause": [{"type": "query_shard_exception","reason": "failed to create query: {\n \"bool\" : {\n \"filter\" : [\n {\n \…

【docker hub镜像源失效】2024年6月6日 docker 国内镜像源失效

文章目录 概述中科大镜像源阿里镜像源其他镜像源可用的镜像源写在最后 之前违反社区规定了,做了和谐 概述 大家都知道使用docker hub官方镜像需要魔法,虽然大部人有魔法,但是网速也是很慢,还有部分同学没有,全靠国内各…

Linux-Https协议

文章目录 前言一、Https协议二、常见的加密方式对称加密非对称加密数据摘要&&数据指纹中间人攻击 三、Https的加密历程方案1-只使用对称加密方案2-只使用非对称加密方案3-双方都使用非对称加密方案4-非对称加密对称加密 前言 之前我们学习了Http协议,也试着…

Bug:SSH Failed Permission Denied(完美解决)

Bug:SSH Failed Permission Denied(完美解决) 今天我本机mac通过ssh访问linux服务器时报错:SSH Failed Permission Denied 思路: linux服务器sshd是否开启linux /etc/ssh/sshd_config配置是否正确(是否开启…

YouTube583美元账户做到一千多万美元,125万粉的顶级交易员

油管125万粉丝的Ross Cameron,一位把583美元账户做到一千多万美元。他说他曾经也是像无头苍蝇一样交易,最终凄惨爆仓,也就是在爆仓之后,他终于开始沉下心来研究交易策略,终于终于,他有一天找到了交易模型,并用它执行至今。 Ross Cameron无疑是最成功的日内交易员之一,而…

Asp.Net Core 读取配置接口 IOptions、IOptionsMonitor以及IOptionsSnapshot

🍀简介 Options是.net Core Web api框架自带的功能,Options模式通过定义强类型的类来表示相关配置设置的集合,使得配置管理更为结构化和类型安全。 IOptions、IOptionsMonitor和IOptionsSnapshot是用于处理配置的依赖注入接口。这些接口允许…

Linux基础 (十八):Libevent 库的安装与使用

目录 一、Libevent 概述 1.0 Libevent的安装 1.0.1 使用源码方式 1.0.2 终端命令行安装 1.1 主要特性 1.2 主要组件 1.3 Libevent 使用模型 1.4 原理 1.5 使用的基本步骤 1.5.1 初始化事件基础设施 1.5.2. 创建和绑定服务器套接字 1.5.3. 设置监听事件 1.5.4. 定义…

电脑缺失d3dcompiler_47.dll会怎么样,该如何修复呢

在计算机使用过程中,我们常常会遇到一些错误提示,其中之一就是“缺少d3dcompiler47.dll文件”。那么,d3dcompiler47.dll到底是什么?为什么计算机会缺失它?它会对电脑产生什么具体影响?如何解决这个问题&…

【CT】LeetCode手撕—25. K 个一组翻转链表

目录 题目1-思路2- 实现⭐25. K 个一组翻转链表——题解思路 3- ACM实现 题目 原题连接:25. K 个一组翻转链表 1-思路 1. dummyHead:设置虚拟头结点,通过虚拟头结点保证每个结点的地位相同2. 定位 pre 和 end 拆链:借助 pre 、s…

(新)Spring Security如何实现登录认证(实战篇)

一、回顾认证流程详解 概念速查: Authentication接口: 它的实现类,表示当前访问系统的用户,封装了用户相关信息。 AuthenticationManager接口:定义了认证Authentication的方法 UserDetailsService接口:加载用户特定数据的核心接…

软件体系结构笔记(自用)

来自《软件体系结构原理、方法与实践(第三版)》清华大学出版社 张友生编著 1-8章12章 复习笔记 如有错误,欢迎指正!!!

Python使用策略模式生成TCP数据包

使用策略模式(Strategy Pattern)来灵活地生成不同类型的TCP数据包。 包括三次握手、数据传输和四次挥手。 from scapy.all import * from scapy.all import Ether, IP, TCP, UDP, wrpcap from abc import ABC, abstractmethodclass TcpPacketStrategy(A…

网络安全技术实验六 入侵检测技术实践

一、实验目的和要求 理解基于网络的入侵检测系统的基本原理,掌握snort IDS工作机理; 学习应用snort三种方式工作;熟练编写snort规则; 完成snort数据包记录、日志查看、字符串匹配、ARP欺骗攻击检测、端口扫描工具检测等功能。 …

微信小游戏插件申请,微信小程序插件管理

微信小游戏的插件申请与小程序不一样,官方没有提供一个统一的管理入口进行申请插件,以及查看插件,没有小程序方便的; 小程序申请查看插件入口如下图所示: 小游戏的插件可以通过以下的方式进行申请: 如下…

代码随想录-Day31

455. 分发饼干 假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都…

OpenCV形态学

什么事形态学处理 基于图像形态进行处理的一些基本方法; 这些处理方法基本是对二进制图像进行处理; 卷积核决定着图像出来后的效果。 一 图像二值化 什么是二值化 将图像的每个像素变成两种值,如0,255. 全局二值化。 局部二值化。 thres…

小学奥数-图像找规律之招聘测评题

文章目录 长得差不多平移(1)(2) 旋转规律(1) 翻转规律 长得有点不一样叠加 参考 比如腾讯给他投简历之后会发一个在线测评,这些题目有和公务员考试很像的 长得差不多 几张图长得差不多的时候&a…

TCP/IP协议深入解析,初学者必看!

简介 在信息技术飞速发展的今天,网络已成为人类社会不可或缺的部分。实现网络中计算机相互通信的关键之一便是TCP/IP协议。作为互联网的基础,TCP/IP协议确保了全球范围内的数据交换和信息共享。 TCP/IP(传输控制协议/网际协议)是…

大数据实训项目(小麦种子)-01、VirtualBox安装与Centos7系统安装

文章目录 前言项目介绍项目任务目标一、VirtualBox安装1.1、认识VirtualBox1.2、VirtualBox的下载安装 二、VirtualBox安装Centos7系统2.1、VirtualBox安装Centos72.2、Centos7配置静态IP地址2.3、Centos7环境基础配置 三、Windows安装FinalShell及连接Centos73.1、FinalShell下…