基于MCX A MCU的PMSM无感FOC控制:从算法原理到工程实践
2026/8/20 6:27:26
在 Java 中,static关键字不仅可以修饰变量和方法,还可以修饰代码块。
静态代码块(static block)是类加载阶段执行的一段代码,常用于类级别的初始化操作。
本文将从语法、执行时机、底层原理、使用场景、常见陷阱以及面试要点等方面,简单介绍Java 的静态代码块。如有问题,欢迎在评论区留言( •̀ ω •́ )✧
静态代码块是使用static {}定义的代码块:
static{// 静态初始化代码}特点:
静态代码块是 Java 在“类加载阶段”留给开发者的初始化钩子。
以下情况会触发类加载:
new创建对象Class.forName)classTest{static{System.out.println("静态代码块执行");}publicTest(){System.out.println("构造方法执行");}}publicclassMain{publicstaticvoidmain(String[]args){newTest();}}输出结果:
静态代码块执行 构造方法执行📌 说明:
静态代码块 → 构造方法
{System.out.println("构造代码块");}| 对比项 | 静态代码块 | 构造代码块 |
|---|---|---|
| 关键字 | static | 无 |
| 执行时机 | 类加载时 | 创建对象时 |
| 执行次数 | 一次 | 每次创建对象 |
| 作用对象 | 类 | 实例 |
| 常见用途 | 初始化静态资源 | 初始化实例数据 |
classDemo{static{System.out.println("static block 1");}static{System.out.println("static block 2");}}输出:
static block 1 static block 2📌按书写顺序执行
classParent{static{System.out.println("父类静态代码块");}}classChildextendsParent{static{System.out.println("子类静态代码块");}}publicclassTest{publicstaticvoidmain(String[]args){newChild();}}输出:
父类静态代码块 子类静态代码块📌 顺序总结:
父类静态代码块 → 子类静态代码块 → 构造代码块 → 构造方法classConfig{staticMap<String,String>map;static{map=newHashMap<>();map.put("url","localhost");map.put("port","8080");}}static{try{Class.forName("com.mysql.cj.jdbc.Driver");}catch(ClassNotFoundExceptione){e.printStackTrace();}}当初始化逻辑较复杂,静态变量一行代码无法完成时,静态代码块非常合适。
returnstatic{return;// ❌ 编译错误}intx=10;static{System.out.println(x);// ❌}原因:
静态代码块执行时,对象尚未创建
static{// 不能抛受检异常try{// risky code}catch(Exceptione){e.printStackTrace();}}classOrderTest{staticinta=10;static{a=20;}staticintb=30;}执行后:
a==20b==30📌 规则:
按代码书写顺序执行
<clinit>在多线程环境下只执行一次一次(类加载时)
不继承,但会先执行父类静态代码块
不能
static 方法可多次调用,static 代码块只执行一次
如果还没理解,可参考
静态代码块、构造代码块、构造方法的执行顺序- bilibili.com
Java静态代码块深度剖析:机制、特性与最佳实践 - 稀土掘金