普通代码块是定义在类中、方法外的实例初始化块,每次创建对象时按声明顺序执行且优先于构造方法,用于封装多个构造器共用的初始化逻辑。

Java 中普通代码块(也叫实例初始化块)通过一对大括号 {} 直接定义在类中、方法外,能实现逻辑的块级封装——它在每次创建对象时自动执行,且优先于构造方法,适合抽取多个构造器共用的初始化逻辑。
普通代码块的基本写法与执行时机
普通代码块不是静态的,也不属于任何方法,它属于实例级别:
- 写在类体内部、所有方法和构造器之外;
- 每次 new 对象时,JVM 按代码出现顺序,先执行普通代码块,再执行构造方法;
- 若类有多个普通代码块,按从上到下的顺序依次执行。
示例:
class Person {
{ System.out.println("普通代码块1"); }
public Person() { System.out.println("构造方法"); }
{ System.out.println("普通代码块2"); }
}
// 输出顺序:普通代码块1 → 普通代码块2 → 构造方法
用普通代码块封装共用初始化逻辑
当多个构造器需要执行相同初始化操作(如校验、默认赋值、资源预加载),把这部分逻辑提到普通代码块里,可避免重复代码,也比在每个构造器里复制更易维护。
立即学习“Java免费学习笔记(深入)”;
- 适合处理依赖实例变量的初始化(比如根据 name 初始化 id);
- 不能直接访问尚未声明的变量(遵循声明顺序);
- 不能抛出受检异常,除非内部 try-catch 处理掉。
对比:如果初始化逻辑不依赖 this 或实例状态,用静态代码块更合适;如果只在某个构造器中需要,则仍应留在构造器内。
普通代码块与构造器、静态代码块的区别
三者共存时的执行顺序是:静态代码块 → 普通代码块 → 构造器。关键区别在于作用域和触发条件:
- 静态代码块:类加载时执行一次,只能初始化静态成员;
- 普通代码块:每次实例化执行,可操作所有实例成员,天然支持块级作用域(变量仅在块内有效);
- 构造器:可重载、可传参,是对象创建的“入口”,但不适合放多构造器共用的冗余逻辑。
注意事项与常见误区
使用普通代码块时需注意实际约束,避免隐式错误:
- 不能定义方法或嵌套类,只能包含语句和局部变量声明;
- 局部变量作用域仅限该块,不可被构造器或其他块访问;
- 不要在其中调用可能被子类重写的方法(this.xxx()),因此时子类字段还未初始化,易引发空指针或未定义行为;
- 过度使用会让初始化流程变隐晦,建议配合注释说明意图,例如:
// 公共字段校验与默认值设置。


















