实例初始化块在每次创建对象时执行,用于共享构造函数的初始化逻辑;静态初始化块在类加载时执行一次,用于初始化静态资源;两者均在构造方法前运行,且遵循特定执行顺序:父类静态→子类静态→父类实例→父类构造→子类实例→子类构造。

在Java中,初始化块(Initialization Block)是一段在创建对象时自动执行的代码块,用于初始化对象的状态。它可以在类中独立存在,不依赖于构造方法,但会在构造方法执行之前运行。初始化块分为两种:实例初始化块和静态初始化块。
实例初始化块(Instance Initialization Block)
实例初始化块用于初始化每个对象的公共部分,无论通过哪个构造函数创建对象,该块都会被执行一次。语法:
{
// 实例初始化块中的代码
// 例如:赋值、调用方法等
}
特点与用途:
- 在每次创建对象时执行,且在构造方法之前运行
- 可以用来提取多个构造方法中的重复初始化逻辑
- 可以访问实例变量和方法
- 即使没有显式定义,JVM也会将实例变量的直接赋值语句合并到初始化块中
示例:
立即学习“Java免费学习笔记(深入)”;
public class Person {
private String name;
private int age;
// 实例初始化块
{
System.out.println("初始化块执行");
age = 18; // 默认年龄
}
public Person() {
System.out.println("无参构造");
}
public Person(String name) {
this.name = name;
System.out.println("有参构造");
}
}
当你使用 new Person() 或 new Person("Tom") 时,都会先打印“初始化块执行”,再执行对应的构造方法。
静态初始化块(Static Initialization Block)
静态初始化块用于初始化类的静态成员,只在类加载时执行一次,通常用于加载配置、连接数据库或初始化静态资源。语法:
static {
// 静态初始化块中的代码
}
特点与用途:
- 仅在类第一次被加载时执行一次(比如首次创建对象或访问静态成员)
- 常用于初始化静态变量、读取配置文件、注册驱动等
- 不能访问实例成员,只能访问静态成员
- 一个类可以有多个静态块,按书写顺序执行
示例:
立即学习“Java免费学习笔记(深入)”;
public class DatabaseUtil {
private static Connection conn;
static {
System.out.println("加载数据库驱动...");
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "user", "pass");
} catch (Exception e) {
e.printStackTrace();
}
}
}
这个静态块在类加载时自动运行,确保数据库连接在首次使用前就已建立。
初始化块的执行顺序
当创建一个对象时,Java按照以下顺序执行初始化相关代码:- 父类静态变量和静态块(按顺序)
- 子类静态变量和静态块
- 父类实例变量和实例块
- 父类构造方法
- 子类实例变量和实例块
- 子类构造方法
理解这个顺序有助于分析复杂继承结构下的对象初始化过程。
基本上就这些。初始化块虽然不常显式使用,但在处理多构造函数共用逻辑或类加载初始化时非常实用。










