静态变量什么时候初始化java
时间: 2025-02-16 10:01:33 AIGC 浏览: 65
### Java 中静态变量的初始化时机
在 Java 中,静态变量属于类而非实例,在整个程序生命周期内只有一份副本。当 JVM 加载类时会执行一次静态变量的初始化操作。
#### 类加载与静态变量初始化
JVM 使用一种称为“懒汉式”的策略来加载类文件并解析成相应的 Class 对象。只有当首次主动使用某个特定类型的对象或访问其静态成员时才会触发这个过程[^3]。此时不仅会分配内存空间给这些静态字段,还会按照定义顺序依次调用任何存在的静态初始化块完成赋值工作:
```java
package com.example;
public class StaticInitDemo {
static String first = "First";
static {
System.out.println("Static initialization block executed.");
second = "Second"; // Assigning value inside static init block.
}
static String second;
}
```
一旦上述 `StaticInitDemo` 被初次引用(比如创建新实例、调用静态方法),控制台将打印出消息表明静态初始化区块被执行了,并且两个字符串型静态属性都被赋予相应初始值[^1]。
需要注意的是,如果存在多个静态域以及/或者多处静态初始化代码片段,则它们之间遵循源码里的先后次序来进行设置活动。例如下面这段来自不同引用的例子展示了这一点:
```java
class InstanceTest2 {
static int b = 11; // First assignment
static{
a = 20; // Second, modifies 'a'
b = 22; // Third, overrides previous 'b' value
}
static int a = 10; // Fourth assignment after modification by static block above.
public static void main(String[] args){
System.out.println("a=" + InstanceTest2.a);
System.out.println("b=" + InstanceTest2.b);
}
}
```
在这个例子中,尽管显式的声明位置是在后面,但是由于静态初始化块的存在使得实际生效的结果有所不同。最终输出显示 `a=20`, `b=22` 表明即使后来又出现了针对相同名称静态整数的新定义语句也不会覆盖已经由前面发生的动作所设定好的数值[^2]。
另外值得注意的一点是,即便同一个类内的其他部分可能会多次提及到某些静态成分,然而真正意义上的初始化却只会发生一次——即随着目标类别被引入之时同步启动这一流程[^4]。
阅读全文
相关推荐
















