代码块、静态代码块、构造函数(构造器)的执行顺序

本文详细解析了Java中静态代码块与非静态代码块的执行时机、执行次数及应用场景,强调了它们在初始化static变量时的区别。通过具体代码示例,展示了两者在类加载过程中的先后顺序,为理解Java类加载机制提供了实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static{}(静态代码块)与{}(非静态代码块)的异同点

相同点:
    都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个。
    一般在代码块中对一些static变量进行赋值。

不同点:
    静态代码块在非静态代码块之前执行(静态代码块—>非静态代码块—>构造方法)。
    静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new
    一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。

public class Testmain {
	
	static class A{
	//静态代码块
		static{ 
			System.out.println("static 代码块 A");
		}
		
	//代码块
		{System.out.println("代码块 A");}
	
	//构造器	
		public A(){
			System.out.println("A");
		}
	}
	
	static class B extends A{
	//静态代码块
		static{ 
			System.out.println("static 代码块 B");
		}
		
	//代码块
		{System.out.println("代码块 B");}
	
	//构造器	
		public B(){
			System.out.println("B");
		}
		
	}

	public static void main(String[] args) {
		new B();
	}

}
### Java 初始化过程中代码块、属性和构造器的调用顺序 在Java中,当一个类被加载到JVM时,其初始化过程遵循特定的顺序执行静态代码块、实例代码块(也称为构造代码块)、构造函数以及其他成员变量的赋值操作。 #### 静态代码块 静态代码块是在类加载阶段被执行的一次性初始化部分。这类代码块由`static`关键字修饰,在整个应用程序生命周期内只运行一次,并且先于任何其他类型的代码块构造函数执行[^1]。 ```java static { System.out.println("静态代码块"); } ``` #### 实例代码块 实例代码块是指不带`static`关键词的大括号包围的部分,它会在每次创建新对象之前自动执行。这意味着每当通过`new`关键字实例化该类的对象时都会触发此段逻辑,可以用来完成一些通用性的初始化工作[^2]。 ```java { System.out.println("实例代码块"); } ``` #### 成员变量初始化与构造函数 成员变量可以在声明的同时赋予初始值;而构造函数则用于设置对象的状态并可接受外部参数作为输入来进行更复杂的配置。它们均位于上述两种特殊代码块之后处理: - **成员变量**:按照源码书写位置依次进行默认或显式的初始化。 - **构造函数**:最后才得到调用,负责最终确立对象的具体形态[^3]。 综上所述,完整的初始化流程如下所示: 1. 加载类文件 -> 执行所有静态代码块 (按出现顺序); 2. 创建对象实例 -> 设置成员变量初值; 3. 对象实例化期间 -> 依照定义先后顺序逐一激活各个实例代码块; 4. 完成以上步骤后 -> 调用相应的构造函数完成剩余设定。 为了更好地理解这一系列事件的发生时机及其相互关系,下面给出一段综合示例代码展示不同组件之间的交互方式[^5]: ```java public class InitializationOrderDemo { // 步骤0: 类加载时立即打印消息 static { System.out.println("Step 0: Static block executed."); } private String message; // 步骤1: 字段声明处即刻生效 { this.message = "Instance initialization."; System.out.println("Step 1: Instance initializer runs before constructor."); } // 构造器 public InitializationOrderDemo() { System.out.println("Step 2: Constructor called with field value: " + message); } public static void main(String[] args) { new InitializationOrderDemo(); } } ``` 这段程序会输出以下内容,体现了各环节的实际发生时刻: ``` Step 0: Static block executed. Step 1: Instance initializer runs before constructor. Step 2: Constructor called with field value: Instance initialization. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码神附体

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值