java static初始化顺序

本文详细解析了Java中静态成员变量、静态代码块及普通代码块的执行顺序,并通过实例展示了初始化过程。理解这些概念有助于深入掌握Java类的加载机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class StaticDemo{
static StaticDemo staticDemo = new StaticDemo();
static String bb = "静态成员变量";
static{
System.out.println("bb=" + bb);
System.out.println("静态初始代码块");
}

{
System.out.println("bb=" + bb);
System.out.println("初始代码块");
}
public StaticDemo(){
System.out.println("构造方法");

}


public static void main(String[] args) {
new StaticDemo();
}

bb=null
初始代码块
构造方法
静态成员变量
静态初始代码块
bb=静态成员变量
初始代码块
构造方法

分析执行顺序:

1.先执行静态成员变量staticDemo,但这个静态成员变量创建本类新的对象,静态成员变量初始化本类时,本类的静态代码块暂停初始化。所以静态成员变量staticDemo执行打印顺序是bb=null初始代码块,构造方法。

1).null是因为static String bb = "静态成员变量";还没有初始化

2).先执行初始化块在执行构造方法

2.依次执行静态代码块

3.静态只执行一次

4.接着执行main方法里面new StaticDemo();初始化后面的成员变量,初始化代码块,构造方法

### Java 中 `static` 关键字的初始化过程 在 Java 中,`static` 是用于声明属于类而非特定对象的字段、方法或代码块的关键字。以下是关于 `static` 的初始化过程及其使用的详细介绍: #### 静态变量和静态代码块的加载顺序 当 JVM 加载一个类时,会按照以下顺序处理该类中的静态部分: 1. **静态变量的初始化** 静态变量会在类被加载时按其在源码中出现的顺序依次初始化[^1]。 2. **静态代码块的执行** 执行所有的静态代码块,同样遵循它们在源码中定义的顺序[^2]。 这些操作只发生一次,即第一次使用该类时触发(例如通过创建实例或者访问静态成员)。一旦类被加载并完成了静态初始化,后续对该类的操作不会再次触发这一过程。 #### 示例分析 考虑下面的例子来理解具体的流程: ```java public class StaticInitExample { static int x = getValue(); static { System.out.println("Static block executed"); } public static int getValue() { System.out.println("getValue method called"); return 42; } } ``` 运行此程序的结果将是先输出 `"getValue method called"` ,接着才是 `"Static block executed"` 。这表明即使存在显式的赋值逻辑,JVM也会优先依据书写次序完成所有必要的准备工作后再进入下一个阶段[^3]。 #### 解决可能遇到的问题——重复初始化情况下的应对策略 有时开发者可能会面临某些特殊场景下需要重新设置某个已经存在的静态属性的情况。虽然理论上讲,除非卸载再重载整个 ClassLoader 否则无法做到真正的“重新”初始化;不过可以通过设计模式规避此类需求,比如采用单例模式控制资源获取时机等手段间接达成目的[^3]。 另外值得注意的是,在涉及继承关系的情况下,父类的所有静态组件都会早于任何子类相关内容得到处置[^5]。这意味着如果尝试从派生类别处引用超类型里的东西,则需确保前者已被适当安排好才能正常运作。 ### 使用建议 为了使应用程序更加健壮可靠,在运用 `static` 进行开发期间应当注意几点事项: - 尽量减少对外暴露可变状态的机会; - 对共享数据结构采取同步措施防止并发冲突; - 明确区分哪些行为应该关联至具体实体之上而不是全局范围内适用的功能模块里去实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值