[Java基础] 成员变量和局部变量

时间:2023-02-15 13:18:31

[Java基础] 成员变量和局部变量


成员变量

成员变量无须显示初始化,只要为一个类定义了类属性或实例属性,则系统会在这个类的准备阶段或创建这个类的实例时进行默认初始化,成员变量默认初始化时的赋值规则与数组动态初始化时数组元素的赋值规则完全相同。


成员变量的初始化和内存中的运行机制

当系统加载类或创建类的实例时,系统自动为成员变量分配内存空间,并在分配内存空间后,自动为成员变量指定初始值。

其实细分下来,有两个步骤,例如下面的代码:

class Person {
static int num;
int age;
}

public class InitVariable {
public static void main(String[] args) {
Person person = new Person();
}
}
1、首次加载 Person 类时(尚未创建对象),系统仅为类成员变量 num 在堆内存中分配存储空间:

(实际上,当 Person 类完成初始化后,系统会隐式的为 Person 类创建一个类对象,此处就不做深入分析!)

[Java基础] 成员变量和局部变量

2、Person 类加载完成后,首次及以后创建对象时,系统仅需为实例成员变量 age 在堆内存中分配存储空间,并在方法的栈内存中创建一个局部引用变量 person 即可。再也不用管类成员变量 num 分配空间的事儿了:

[Java基础] 成员变量和局部变量




局部变量

局部变量除了形参之外,都必须显式初始化。也就是说,系统不会默认初始化它们,必须先给方法局部变量和代码块局部变量指定初始值,否则不可以访问它们。形参的初始化在调用该方法时由系统完成,调用时,系统会在该方法栈内为所有形参分配内存空间,并将实参的值赋给对应的形参,这就完成了形参的初始化。


局部变量的初始化和内存中的运行机制

局部变量定义以后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。这意味着定义局部变量后,系统并未为这个变量分配内存空间,直至等到程序为这个局部变量赋初始值时,系统才会为其分配内存,并将初始值保存到这块内存中。

与成员变量不同,局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中的。栈内存中的变量无须系统垃圾回收,栈内存中的变量往往是随方法或代码块的运行结束而结束的。因此,局部变量的作用域是从初始化该变量开始,直到该方法或该代码块运行完成而结束。因为局部变量只保存基本类型的值或是对象的引用,因此局部变量所占的内存区通常比较小。