news 2026/10/6 11:22:24

【Java】关于 Java 静态代码块(static block)——原理与用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java】关于 Java 静态代码块(static block)——原理与用法

文章目录

    • 一、什么是静态代码块?
    • 二、静态代码块的执行时机
      • 类什么时候被加载?
      • 执行顺序示例
    • 三、静态代码块 vs 构造代码块
      • 构造代码块(实例代码块)
      • 对比表
    • 四、多个静态代码块的执行顺序
      • 同一个类中
      • 父类与子类的执行顺序
    • 五、静态代码块的典型使用场景
      • 初始化静态变量
      • 加载资源或驱动
      • 复杂初始化逻辑
    • 六、静态代码块中的注意事项(重点)
      • 不能使用 `return`
      • 不能访问实例变量和实例方法
      • 异常必须处理
    • 七、静态代码块与静态变量初始化顺序
    • 八、JVM 角度理解静态代码块
    • 九、面试高频问题总结
      • ❓ 静态代码块执行几次?
      • ❓ 能否继承?
      • ❓ 静态代码块能访问非静态成员吗?
      • ❓ static 代码块和 static 方法的区别?

一、什么是静态代码块?

在 Java 中,static关键字不仅可以修饰变量和方法,还可以修饰代码块。
静态代码块(static block)是类加载阶段执行的一段代码,常用于类级别的初始化操作。

本文将从语法、执行时机、底层原理、使用场景、常见陷阱以及面试要点等方面,简单介绍Java 的静态代码块。如有问题,欢迎在评论区留言( •̀ ω •́ )✧

静态代码块是使用static {}定义的代码块:

static{// 静态初始化代码}

特点:

  • 属于类本身
  • 在类加载时执行
  • 只执行一次
  • 早于任何对象创建执行

静态代码块是 Java 在“类加载阶段”留给开发者的初始化钩子。


二、静态代码块的执行时机

类什么时候被加载?

以下情况会触发类加载:

  • 使用new创建对象
  • 访问类的静态变量
  • 调用类的静态方法
  • 反射加载类(Class.forName)
  • JVM 启动时加载主类

执行顺序示例

classTest{static{System.out.println("静态代码块执行");}publicTest(){System.out.println("构造方法执行");}}
publicclassMain{publicstaticvoidmain(String[]args){newTest();}}

输出结果:

静态代码块执行 构造方法执行

📌 说明:

静态代码块 → 构造方法


三、静态代码块 vs 构造代码块

构造代码块(实例代码块)

{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();}}

复杂初始化逻辑

当初始化逻辑较复杂,静态变量一行代码无法完成时,静态代码块非常合适。


六、静态代码块中的注意事项(重点)

不能使用return

static{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

📌 规则:

按代码书写顺序执行


八、JVM 角度理解静态代码块

  • 静态代码块在类初始化阶段( 方法)执行
  • JVM 保证<clinit>在多线程环境下只执行一次
  • 天然线程安全

九、面试高频问题总结

❓ 静态代码块执行几次?

一次(类加载时)

❓ 能否继承?

不继承,但会先执行父类静态代码块

❓ 静态代码块能访问非静态成员吗?

不能

❓ static 代码块和 static 方法的区别?

static 方法可多次调用,static 代码块只执行一次


如果还没理解,可参考

静态代码块、构造代码块、构造方法的执行顺序- bilibili.com

Java静态代码块深度剖析:机制、特性与最佳实践 - 稀土掘金

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/5 23:07:46

为什么说Qwen3-8B是学术研究的理想选择?实测报告出炉

为什么说Qwen3-8B是学术研究的理想选择&#xff1f;实测报告出炉 在AI科研门槛日益抬高的今天&#xff0c;动辄千亿参数、依赖A100集群的大模型虽然性能惊艳&#xff0c;却让大多数高校实验室和独立研究者望而却步。一张RTX 3090显卡跑不动主流模型的尴尬现实&#xff0c;正在成…

作者头像 李华
网站建设 2026/10/5 12:48:38

java基础-PriorityQueue(优先队列)

1. 基本概念PriorityQueue 是 Java 集合框架中的一个基于优先堆的无界队列。它使用优先顺序&#xff08;通常是元素的自然顺序或自定义比较器&#xff09;来管理元素&#xff0c;而不是标准的 FIFO&#xff08;先进先出&#xff09;顺序。// 基本创建方式 PriorityQueue<Int…

作者头像 李华
网站建设 2026/10/5 18:26:43

Qwen3-14B模型量化压缩技术:降低GPU内存占用

Qwen3-14B模型量化压缩技术&#xff1a;降低GPU内存占用 在企业级AI应用加速落地的今天&#xff0c;一个现实问题日益凸显&#xff1a;如何让高性能大模型跑得动、用得起&#xff1f;以Qwen3-14B为代表的中型语言模型虽具备出色的推理能力&#xff0c;但原始FP16精度下近28GB的…

作者头像 李华
网站建设 2026/10/6 4:39:11

18、日期和时间的格式化、解析及时间区域的使用

日期和时间的格式化、解析及时间区域的使用 1. 日期和时间的格式化与解析 1.1 不同地区的日期格式差异 日期的格式会因地区而异。例如,2002 年 5 月 9 日,在美国英语(en - US)地区的短格式为 5/9/02,而在法国法语(fr - FR)地区则为 09/05/02。 1.2 JSTL 的日期格式化…

作者头像 李华
网站建设 2026/10/5 5:55:06

VisionPro CogIPOneImageTool1 工具超详细解释(含内部功能全解析)

CogIPOneImageTool1 工具一、工具基本定位CogIPOneImageTool1 是康耐视 (Cognex) VisionPro 视觉软件中的单图像基础图像处理工具&#xff0c;专注于对单张输入图像执行像素级的预处理操作&#xff08;如亮度调整、滤波降噪、形态学处理、几何变换等&#xff09;。它是 VisionP…

作者头像 李华
网站建设 2026/10/5 22:48:23

VisionPro CogIDTool 工具超深度详解(技术细节 + 实战配置版)

CogIDTool 工具超深度详解一、工具基本定位&#xff1a;工业条码识读的 “全能型工具”CogIDTool1 是康耐视 (Cognex) VisionPro 中专注于多码制条码 / 二维码识读的专业工具&#xff0c;区别于 VisionPro 中简单的CogBarcodeTool&#xff08;仅支持基础一维码&#xff09;&…

作者头像 李华