Java代码块是Java程序中用一对大括号{}包裹起来的代码段,它不属于任何方法、构造函数或者类的一部分独立结构,根据定义位置和修饰符的不同,分为多种类型,每种类型都有特定的执行规则和适用场景。

Java代码块的主要类型
1. 静态代码块
静态代码块使用static关键字修饰,定义在类中方法外,随着类的加载而执行,且只会执行一次,主要用于类的初始化操作,比如加载配置文件、初始化静态变量等。它的执行时机早于所有对象的创建,也早于构造代码块和构造函数。
public class StaticBlockDemo {
// 静态变量
private static String config;
// 静态代码块
static {
System.out.println("静态代码块执行");
// 模拟加载配置
config = "默认配置";
}
public static void main(String[] args) {
System.out.println("配置内容:" + config);
// 再次创建对象,静态代码块不会重复执行
new StaticBlockDemo();
}
}
2. 构造代码块
构造代码块也叫实例代码块,定义在类中方法外,没有static修饰,每次创建对象的时候都会执行,执行时机在构造函数之前。它的作用是把多个构造函数中重复的代码提取出来,减少代码冗余。
public class ConstructBlockDemo {
private String name;
// 构造代码块
{
System.out.println("构造代码块执行,初始化公共逻辑");
}
// 无参构造函数
public ConstructBlockDemo() {
System.out.println("无参构造函数执行");
}
// 有参构造函数
public ConstructBlockDemo(String name) {
this.name = name;
System.out.println("有参构造函数执行,name:" + name);
}
public static void main(String[] args) {
new ConstructBlockDemo();
new ConstructBlockDemo("测试");
}
}
3. 局部代码块
局部代码块定义在方法内部,用大括号包裹,它的作用是限制变量的作用域,让变量在局部代码块执行结束后就被回收,节省内存空间,目前在开发中使用的频率相对较低。
public class LocalBlockDemo {
public static void main(String[] args) {
int a = 10;
// 局部代码块
{
int b = 20;
System.out.println("局部代码块内,a:" + a + ",b:" + b);
}
// 这里无法访问变量b,会编译报错
// System.out.println(b);
}
}
不同类型代码块的执行顺序
当类中同时存在静态代码块、构造代码块和构造函数时,执行顺序遵循以下规则:
- 首次加载类时,先执行静态代码块,且只执行一次
- 每次创建对象时,先执行构造代码块,再执行对应的构造函数
- 局部代码块在方法调用到对应位置时执行,遵循方法的执行流程
下面通过一个完整的示例验证执行顺序:
public class OrderDemo {
// 静态代码块
static {
System.out.println("1. 静态代码块执行");
}
// 构造代码块
{
System.out.println("2. 构造代码块执行");
}
// 构造函数
public OrderDemo() {
System.out.println("3. 构造函数执行");
}
public void test() {
// 局部代码块
{
System.out.println("4. 局部代码块执行");
}
}
public static void main(String[] args) {
System.out.println("--- 第一次创建对象 ---");
OrderDemo demo1 = new OrderDemo();
demo1.test();
System.out.println("--- 第二次创建对象 ---");
OrderDemo demo2 = new OrderDemo();
demo2.test();
}
}
上述代码执行后输出结果为:
1. 静态代码块执行
--- 第一次创建对象 ---
2. 构造代码块执行
3. 构造函数执行
4. 局部代码块执行
--- 第二次创建对象 ---
2. 构造代码块执行
3. 构造函数执行
4. 局部代码块执行
Java代码块的使用场景总结
| 代码块类型 | 适用场景 |
|---|---|
| 静态代码块 | 类级别的初始化,比如加载静态配置、初始化静态工具类、注册驱动等只需要执行一次的操作 |
| 构造代码块 | 多个构造函数共有的初始化逻辑,避免代码重复,比如所有对象创建时都需要打印日志、初始化公共实例变量 |
| 局部代码块 | 限制变量作用域,减少内存占用,目前较少使用,部分老代码或者特殊逻辑中可能会见到 |
合理使用Java代码块可以让代码结构更清晰,减少冗余代码,同时也能更好地控制初始化逻辑的执行时机,是Java基础中需要掌握的重要知识点。