构造代码块先于构造方法执行且每次创建对象时都运行;它位于类中非方法内、用{}包裹,按定义顺序从上到下执行,即使this()调用其他构造器也只执行一次。

构造代码块先于构造方法执行,且在每次创建对象时都会运行。
构造代码块的执行时机
构造代码块(即用 {} 包裹、位于类中但不在任何方法内的代码)会在每次调用构造方法前自动执行。它属于实例初始化的一部分,优先级高于构造方法体,但低于静态代码块(只执行一次)。
- 只要 new 一个对象,构造代码块就会执行一次
- 多个构造代码块按定义顺序从上到下依次执行
- 即使构造方法中调用了 this() 重载其他构造器,构造代码块仍只执行一次(在最终选定的构造方法开始前)
验证执行顺序的典型示例
以下代码可清晰观察执行流程:
class Demo {
{ System.out.println("构造代码块1"); }
{ System.out.println("构造代码块2"); }
public Demo() {
System.out.println("无参构造方法");
}
public Demo(String s) {
this(); // 调用无参构造
System.out.println("有参构造方法");
}
}
// 执行 new Demo("test") 输出:
// 构造代码块1
// 构造代码块2
// 无参构造方法
// 有参构造方法
输出顺序说明:两个构造代码块先执行,再进入 this() 调用的无参构造,最后执行有参构造中剩余语句。
立即学习“Java免费学习笔记(深入)”;
与静态代码块、字段初始化的完整顺序
一个对象创建过程中,初始化阶段的完整执行顺序为:
- 父类静态代码块(仅首次加载类时执行)
- 子类静态代码块(仅首次加载类时执行)
- 父类构造代码块
- 父类字段默认值/显式初始化(如 int x = 10;)
- 父类构造方法
- 子类构造代码块
- 子类字段默认值/显式初始化
- 子类构造方法
实际开发中的注意点
构造代码块适合放置所有构造方法共用的初始化逻辑,比如资源预检查、日志记录或统一赋值。但要注意:
- 不能接收参数,灵活性不如构造方法
- 若含异常抛出,所有构造方法都需声明 throws 或 try-catch
- 过度使用可能降低可读性,简单初始化建议直接写在字段声明处










