实例初始化块是每次创建对象时自动执行的代码块,写在类中方法外、用{}包裹,位于构造方法体之前按声明顺序执行,适合多构造方法共用的初始化逻辑。

在 Java 中,每次创建对象时都会自动执行的代码块是 实例初始化块(Instance Initializer Block)。它不属于构造方法,也不属于静态内容,而是直接写在类中、方法外的一段用 {} 包裹的代码,会在每次调用构造方法前、按声明顺序执行。
实例初始化块怎么写?
语法很简单:在类体中、任何方法或字段声明之外,直接写一个用大括号包裹的代码块:
<font color="#888">class Person {
String name;
{ // 实例初始化块
System.out.println("实例初始化块执行了");
name = "默认姓名";
}
public Person() {
System.out.println("无参构造方法执行了");
}
public Person(String name) {
this.name = name;
System.out.println("有参构造方法执行了");
}
}</font>
执行时机和顺序
实例初始化块在每次 new 对象时都会执行,且满足以下规则:
- 它在构造方法体执行 之前 运行
- 多个实例初始化块按它们在类中出现的 文本顺序 执行
- 父类的实例初始化块先于子类的执行(继承链中自上而下)
- 它和字段初始化语句(如
String name = "abc";)本质上等价,编译后会被“复制”进每个构造方法开头
和构造方法、静态块的区别
别混淆这三者:
-
静态初始化块(
static {}):只在类加载时执行一次,不随对象创建重复运行 - 构造方法:可重载、可传参、可控制逻辑分支,是对象创建的入口点
- 实例初始化块:无名称、无参数、不能单独调用,适合写多构造方法共用的初始化逻辑
实用场景举例
比如你有多个构造方法,都需要给某个集合字段赋初值并添加默认元素:
<font color="#888">class Order {
List<string> items = new ArrayList(); // 字段初始化
{ // 复用逻辑:统一添加"运费"
items.add("shipping");
}
public Order() {}
public Order(String item) {
items.add(item);
}
public Order(String item1, String item2) {
items.add(item1);
items.add(item2);
}
}</string></font>
这样就避免了在每个构造方法里重复写 items.add("shipping")。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











