🗒️辨析:成员变量、静态变量、局部变量
Mar 25, 2024
| Mar 25, 2024
0  |  Read Time 0 min
type
status
date
slug
summary
tags
category
icon
password
通过一个具体的例子可以说明成员变量、局部变量和静态变量之间的区别:
在这个例子中,我们定义了三种类型的变量:

【成员变量(Instance Variables)】

memberVar是一个成员变量,也被称为实例变量。成员变量定义在类的结构中,但它们属于类的具体实例,即对象。每当你创建一个类的新实例(新对象)时,Java会为该实例分配一份成员变量的拷贝。这意味着每个对象都有自己的一组成员变量。
尽管成员变量是在类定义中声明的,但每个对象对其成员变量的具体值拥有独立的控制权。一个对象对其成员变量所做的更改不会影响到同一类的其他实例。这叫做成员变量的「唯一性」。
成员变量的生命周期与其所属的对象相同。当一个对象被创建时,它的成员变量也被实例化并赋予初始值;当对象被销毁(例如,被垃圾回收器回收)时,它的成员变量也随之被销毁。

【静态变量(Static Variables)】

staticVar是一个静态变量,使用static关键字定义。静态变量不属于类的任何特定实例,而是属于类本身。这意味着无论你创建了该类的多少个实例,所有这些实例都会共享同一份静态变量的拷贝。这使得静态变量成为存储类级别信息(例如,计数类实例数或全局配置)的理想选择。
静态变量在程序开始执行时创建,并且在第一次加载类时进行初始化,通常是指Java虚拟机(JVM)加载类时。静态变量的初始化发生在任何对象创建之前,即使没有创建类的任何实例。静态变量将保持其值直到程序结束,这时它们被销毁。
静态变量可以通过类名直接访问,无需创建类的实例。这是因为静态变量不依赖于任何特定的对象实例来存在。访问静态变量的通用格式为类名.静态变量名。虽然静态变量也可以通过类的实例来访问,但这种做法通常不推荐,因为它可能会误导开发者认为变量属于实例。
静态变量的作用域是全局的,它们在整个应用程序中都是可见的,前提是它们的访问权限允许这样做(例如,如果它们被标记为public)。静态变量的生命周期与程序的生命周期相同,从程序开始时创建直到程序结束时销毁。

【局部变量(Local Variables)】

localVar是一个局部变量,它定义在方法中。局部变量的生命周期只在方法执行的时候,方法执行结束后,局部变量就会被销毁。局部变量在方法、构造器或块中定义,并且只在它们被定义的区域内可见和可用。一旦执行流离开这个区域,局部变量就无法被访问,并且它们所占用的资源将被释放。
局部变量在使用前必须被明确初始化。它们不像成员变量那样有默认值。这要求程序员在使用局部变量前必须给它们赋予一个确定的值,这有助于避免程序中潜在的逻辑错误。局部变量被存储在栈内存中,这使得它们的访问速度非常快,但相应的是它们的生存期也较短——只存在于它们所属的方法或代码块的执行期间。
在实际应用中,局部变量的使用非常广泛,它们可以作为循环控制的计数器,用于记录循环的次数或控制循环的结束;在条件判断中,局部变量可用于存储条件表达式的结果,帮助决定程序的执行路径;此外,它们也常用于存储和处理方法内的临时数据或进行中间计算,以实现特定的业务逻辑。

总结

特性
成员变量(实例变量)
静态变量(类变量)
局部变量
作用域
整个类内部,但是需要通过对象实例访问
整个应用程序内,可以通过类名或类的实例访问
定义它们的块或方法内
定义位置
在类中,方法外
在类中,方法外,且前面有static关键字
方法内,或者方法的形式参数
初始化值
有默认初始化值(例如int默认为0,对象默认为null)
有默认初始化值,和实例变量相同
局部变量无默认值,在使用它们之前,必须明确地初始化它们
调用方式
通过对象调用,如对象.成员变量名
通过对象或类名调用,如类名.静态变量名对象.静态变量名
直接使用变量名
存储位置
堆(Heap)中
方法区(Method Area)或称为静态存储区
栈(Stack)中
生命周期
与对象的生命周期一致,对象被销毁时销毁
与类的生命周期一致,程序结束时销毁
与方法的生命周期一致,方法执行完毕后销毁
别名
实例变量
类变量
无别名
  • java
  • java basics
  • static关键字代码块
    Catalog