java学习--代码块
·
在 Java 中,代码块是用{}包裹的一段代码逻辑,根据定义位置、修饰符和用途,可分为普通代码块、构造代码块(实例代码块)、静态代码块和同步代码块四类,它们的执行时机、作用域和功能各有差异。
1. 普通代码块
- 定义:直接声明在方法、循环或条件语句等局部作用域中的代码块,无特殊修饰符。
- 作用:限定变量作用域(变量仅在代码块内有效),或组织局部逻辑,避免代码冗余。
- 执行时机:调用所在方法 / 执行到代码块位置时执行。
示例:
public class NormalBlockDemo {
public static void main(String[] args) {
// 普通代码块
{
int num = 10;
System.out.println("普通代码块内变量:" + num); // 输出10
}
// System.out.println(num); // 错误:num作用域仅限于代码块内
}
}
2. 构造代码块(实例代码块)
- 定义:直接声明在类中(方法外部)的代码块,无修饰符。
- 作用:提取多个构造器的公共初始化逻辑(如初始化实例变量),避免构造器代码重复。
- 执行时机:每次创建对象时执行,且优先于构造器执行;多个构造代码块按定义顺序执行。
示例:
public class ConstructorBlockDemo {
private String name;
// 构造代码块
{
System.out.println("构造代码块执行");
name = "默认名称"; // 初始化实例变量
}
public ConstructorBlockDemo() {
System.out.println("无参构造器执行");
}
public static void main(String[] args) {
new ConstructorBlockDemo();
// 输出:构造代码块执行 → 无参构造器执行
}
}
3. 静态代码块
- 定义:用
static修饰的代码块,直接声明在类中(方法外部)。 - 作用:初始化静态变量、加载全局资源(如 JDBC 驱动)、执行类级别的初始化操作。
- 执行时机:类加载时执行且仅执行一次(优先于构造代码块和构造器);多个静态代码块按定义顺序执行。
示例:
public class StaticBlockDemo {
public static String config;
// 静态代码块
static {
System.out.println("静态代码块执行");
config = "全局配置初始化"; // 初始化静态变量
}
public StaticBlockDemo() {
System.out.println("构造器执行");
}
public static void main(String[] args) {
new StaticBlockDemo();
// 输出:静态代码块执行 → 构造器执行
}
}
4. 同步代码块
- 定义:用
synchronized修饰的代码块,用于多线程环境。 - 作用:保证同一时间只有一个线程执行代码块逻辑,解决多线程并发安全问题(如共享变量修改)。
- 执行时机:线程获取指定对象的锁后执行,执行完毕释放锁。
示例:
public class SyncBlockDemo {
private int count = 0;
private final Object lock = new Object(); // 锁对象
public void increment() {
// 同步代码块
synchronized (lock) {
count++;
System.out.println("count = " + count);
}
}
public static void main(String[] args) {
SyncBlockDemo demo = new SyncBlockDemo();
new Thread(demo::increment).start();
new Thread(demo::increment).start();
}
}
代码块执行顺序总结
当类加载并创建对象时,执行优先级为:静态代码块(类加载时执行一次) → 构造代码块(每次创建对象执行) → 构造器(每次创建对象执行)
若存在继承关系:父类静态代码块 → 子类静态代码块 → 父类构造代码块 → 父类构造器 → 子类构造代码块 → 子类构造器
注意事项
- 静态代码块不能访问实例变量 / 方法(仅能访问静态成员),因类加载时实例尚未创建。
- 构造代码块用于实例初始化,静态资源初始化需用静态代码块。
- 同步代码块的锁对象建议用
final修饰,避免锁对象被修改导致锁失效。
合理使用代码块可提升代码可读性和执行效率,是 Java 组织逻辑的重要方式。
更多推荐




所有评论(0)