jvm静态变量为什么在初始化的时候才赋值
时间: 2024-02-24 18:05:41 浏览: 23
JVM在加载类时,会为类中的静态变量分配内存,并且对这些静态变量进行默认初始化,即按照类型给变量赋予默认值。对于整型变量,其默认值为0;对于浮点型变量,其默认值为0.0;对于布尔型变量,其默认值为false;对于引用类型变量,其默认值为null。
在静态变量的声明中,我们也可以为其指定初始值,JVM会在类加载时对静态变量进行初始化,并使用指定的初始值。如果没有指定初始值,JVM仍会对静态变量进行默认初始化,但此时变量的值为默认值。但是,如果静态变量的值需要计算(如通过某种方式获取当前时间),则需要在初始化时进行计算,因此JVM在初始化阶段会执行静态变量的赋值操作。
需要注意的是,静态变量只会在类加载时被初始化一次,之后再次访问该变量时,直接使用已经初始化过的值。
相关问题
jvm static初始化
在Java虚拟机中,静态初始化是指在类加载时对静态变量进行初始化的过程。静态初始化是在类加载时完成的,且只会执行一次。当类被加载到虚拟机时,虚拟机会为这个类分配内存,并为该类中的静态变量分配内存空间,并将它们初始化为默认值(如果有的话)。随后,静态初始化器会按照代码中声明的顺序执行,对静态变量进行赋值。如果静态变量是final类型的,则必须在静态初始化器中进行赋值。
在Java中,可以使用静态初始化块或静态变量声明的方式对静态变量进行初始化。静态初始化块是一个被static修饰的代码块,它只会在类加载时执行一次,并且在静态变量声明之前执行。静态变量声明的方式是直接在变量名前加上static关键字,并在后面跟上赋值表达式。
例如:
```
public class Test {
static int i; // 静态变量声明
static {
i = 10; // 静态初始化块
}
}
```
在这个例子中,静态变量i被声明为静态变量,静态初始化块中对它进行了赋值。当Test类被加载到虚拟机时,静态初始化块会被执行,i会被赋值为10。
需要注意的是,静态初始化器是在类加载时执行的,因此它的执行顺序是按照代码中的声明顺序进行的。如果存在多个静态初始化块或静态变量声明,它们会按照声明顺序依次执行。
JVM类加载流程?初始化流程?
JVM类加载流程分为加载、验证、准备、解析和初始化五个阶段。其中,加载阶段是将类的二进制数据读入内存,并生成对应的Class对象;验证阶段是对加载的类进行验证,确保其符合JVM规范;准备阶段是为类的静态变量分配内存,并设置默认初始值;解析阶段是将符号引用转换为直接引用;初始化阶段是执行类的初始化代码,包括静态变量赋值和静态代码块的执行。
JVM类的初始化流程是按照以下顺序执行的:先执行父类的初始化,再执行子类的初始化;静态变量按照定义顺序依次初始化;静态代码块按照定义顺序依次执行。