首页 > 精选知识 >

问 java 中静态代码块 static 的作用 执行原理详解

2026-11-08 15:52:45
最佳答案

答

java 中静态代码块是被 static 修饰的代码块,核心作用就是在类加载的时候自动执行一次,用来完成类的初始化操作,比如初始化静态变量加载配置文件注册驱动初始化静态资源,它属于类级别的代码,不属于任何对象,不管创建多少个该类对象,静态代码块全程只会执行一次,很多新手容易把静态代码块普通构造代码块构造方法搞混,静态代码块跟着类加载执行,构造方法是每次 new 对象的时候执行,执行时机差别很大,面试笔试这个知识点是高频考点,经常考察执行顺序类加载触发条件静态代码块能不能访问非静态成员,静态代码块底层属于类初始化阶段的执行逻辑,JVM 在加载类的时候,会执行类里面所有 static 静态代码块,学习这个知识点也要结合类加载流程理解,理解之后就能看懂 JDBC 里面 Class.forName 加载驱动的底层原理,很多框架初始化逻辑也大量使用静态代码块,之所以设计静态代码块,就是为了把只需要执行一次的类初始化逻辑单独写出来,不用等到创建对象才执行初始化。

基础语法格式

static {

初始化代码

}

特点说明

  • 没有方法名没有返回值,不需要手动调用
  • 属于类,不属于实例对象
  • 类加载阶段自动执行,全程仅执行一次
  • 可以写多个静态代码块,按照代码书写从上到下顺序依次执行

核心作用清单

1 初始化静态成员变量,给 static 修饰的变量赋初始值

2 加载外部配置资源,读取配置文件初始化配置参数

3 注册驱动,经典例子 JDBC 数据库驱动注册,早期写法 Class.forName 触发类加载,执行静态代码块完成驱动注册

4 初始化全局静态资源,比如静态连接池静态缓存

5 做类初始化校验,类加载的时候检查环境参数是否合法

执行时机与触发条件

静态代码块什么时候执行,只要类被 JVM 加载就会触发,常见触发场景

  • 第一次 new 该类对象
  • 调用该类静态方法
  • 访问该类静态变量
  • 使用 Class.forName 反射加载这个类

注意,如果只是定义类,没有触发类加载动作,静态代码块不会执行,类一旦加载完成之后,后续再次 new 对象或者调用静态方法,静态代码块不会重复执行。

执行顺序重点

如果一个类同时存在静态变量初始化 静态代码块 构造代码块 构造方法,完整执行顺序

1 静态变量赋值

2 静态代码块

3 构造代码块

4 构造方法

如果存在继承关系,父类静态代码块优先执行,然后子类静态代码块,之后父类构造代码块父类构造方法,最后子类构造代码块子类构造方法,这个继承场景执行顺序是面试常考题。

重要限制

静态代码块属于类级别代码,只能直接访问 static 静态变量静态方法,不能直接访问普通成员变量实例方法,如果想要访问非静态成员,需要手动创建类对象之后再访问,因为静态代码块执行的时候,对象还没有创建出来,实例成员还不存在。

静态代码块和其他代码块对比表格

类型关键字执行时机执行次数
静态代码块static类加载阶段整个程序只执行一次
构造代码块无 static每次 new 对象之前每创建一次对象执行一次
构造方法和类同名new 对象的时候每创建一次对象执行一次

优缺点

优点

类初始化只执行一次,适合全局静态资源初始化,写法简洁

缺点

类加载的时候就执行,如果初始化代码耗时很长,会拖慢类加载速度,静态代码块里面如果抛出异常,会导致类初始化失败,出现 ExceptionInInitializerError 类初始化异常,而且静态代码块不好维护,复杂业务不建议全部写在静态代码块里面。

整体来说,java 中静态代码块 static 的作用就是类加载时一次性初始化静态资源,记住它只执行一次,区分和构造代码块构造方法执行时机,掌握继承场景下的执行顺序,理解它只能直接访问静态成员这个限制,JDBC 和很多框架初始化都会用到这个知识点。

【常见问题】

问题 1 java 中静态代码块 static 每次 new 对象都会执行吗

回答 1 java 中静态代码块 static 不会每次 new 对象都执行,静态代码块是类加载的时候执行,整个程序只执行一次,new 对象的时候执行的是构造方法和构造代码块。

问题 2 java 中静态代码块 static 可以访问普通成员变量吗

回答 1 java 中静态代码块 static 不能直接访问普通成员变量,静态代码块执行时实例对象还没有创建,如果需要访问,需要手动 new 对象之后再访问实例成员。

问题 3 继承场景下 java 中静态代码块 static 执行顺序是什么

回答 3 继承场景下 java 中静态代码块 static 是父类静态代码块先执行,之后再执行子类静态代码块,之后才执行父类构造相关代码,再执行子类构造相关代码。

问题 4 java 中静态代码块 static 可以写多个吗

回答 3 java 中静态代码块 static 可以写多个,多个静态代码块会按照代码书写从上到下顺序依次执行,全部在类加载阶段执行。

【免责申明】

本文 java 中静态代码块 static 相关原理基于标准 JVM 类加载规范,不同 JDK 版本类加载细节存在微小差异,本文仅作为入门学习面试参考,不覆盖所有复杂反射类加载特殊场景。