静态代码块与普通代码块的区别及执行顺序

本文详细解释了Java中不同类型的代码块(静态代码块、普通代码块和构造代码块)的执行顺序及其特点,帮助读者更好地理解Java程序的执行流程。
总结:

执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。

其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。

 
1、静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。 //如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。 //注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问实例变量和实例方法,需要通过类的实例对象来访问。
 
2、普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”;
 
3、构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。
 
============================================================================================================
摘自:

//执行顺序:(优先级从高到低。)静态代码块>mian方法>构造代码块>构造方法。

其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。

1 普通代码块

复制代码
 1 //普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”
 2 public class CodeBlock01{  3 public static void main(String[] args){  4  5  {  6 int x=3;  7 System.out.println("1,普通代码块内的变量x="+x);  8  }  9 10 int x=1; 11 System.out.println("主方法内的变量x="+x); 12 13  { 14 int y=7; 15 System.out.println("2,普通代码块内的变量y="+y); 16  } 17  } 18  } 19 20 /* 21  运行结果: 22  1,普通代码块内的变量x=3 23  主方法内的变量x=1 24  2,普通代码块内的变量y=7 25 */ 26 
复制代码

 

2 构造代码块

复制代码
//构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。

public class CodeBlock02{
    {
      System.out.println("第一代码块"); } public CodeBlock02(){ System.out.println("构造方法"); } { System.out.println("第二构造块"); } public static void main(String[] args){ new CodeBlock02(); new CodeBlock02(); new CodeBlock02(); } } /* * 执行结果: 第一代码块 第二构造块 构造方法 第一代码块 第二构造块 构造方法 第一代码块 第二构造块 构造方法 */
复制代码

 

3 静态代码块

复制代码
//静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。
//如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。
//注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问实例变量和实例方法,需要通过类的实例对象来访问。 class Code{ { System.out.println("Code的构造块"); } static{ System.out.println("Code的静态代码块"); } public Code(){ System.out.println("Code的构造方法"); } } public class CodeBlock03{ { System.out.println("CodeBlock03的构造块"); } static{ System.out.println("CodeBlock03的静态代码块"); } public CodeBlock03(){ System.out.println("CodeBlock03的构造方法"); } public static void main(String[] args){ System.out.println("CodeBlock03的主方法"); new Code(); new Code(); new CodeBlock03(); new CodeBlock03(); } } /* CodeBlock03的静态代码块 CodeBlock03的主方法 Code的静态代码块 Code的构造块 Code的构造方法 Code的构造块 Code的构造方法 CodeBlock03的构造块 CodeBlock03的构造方法 CodeBlock03的构造块 CodeBlock03的构造方法 */

转载于:https://www.cnblogs.com/YLQBL/p/6478238.html

<think>首先,用户的问题是:“我想理解Java静态代码块和实例代码块执行次数差异 请问Java 静态代码块和实例代码块执行次数的区别及原因”。我需要基于提供的引用内容来回答。 关键点从引用中提取: - 引用[1]:静态代码块在类加载时执行一次;普通代码块(实例代码块)在每次创建对象时执行。 - 引用[2]:静态代码块只在第一次new时执行一次;非静态代码块在每new一次执行一次。 - 引用[3]:静态代码块在类加载时执行一次;不能直接访问实例变量。 - 引用[4]:静态代码块在类加载时执行一次;实例代码块在构造方法之前执行,每次创建对象时执行。 - 引用[5]:示例代码展示了静态代码块、构造代码块和构造方法的执行。 所以,核心区别: - **静态代码块**:执行一次,在类加载时执行。无论创建多少对象,只运行一次。 - **实例代码块**:执行多次,每次创建对象时执行,在构造方法之前运行。 原因: - 静态代码块用于初始化静态变量或执行一次性的类级别操作。 - 实例代码块用于初始化实例变量或执行每次对象创建时的操作。 回答结构: 1. **定义**:先解释什么是静态代码块和实例代码块。 2. **执行次数差异**:明确说明执行次数。 3. **原因**:解释为什么有这种差异,基于JVM的类加载和对象创建机制。 4. **示例**:提供一个简单代码示例来演示。 5. **相关问题**:根据系统指令,生成相关问题。 系统指令要求: - 使用中文回答。 - 行内数学表达式用$...$。 - 独立公式用$$...$$(但这里可能不需要)。 - 引用内容末尾添加引用标识。 - 生成相关问题。 - 回答结构清晰。 生成相关问题:基于主题,生成2-3个相关问题。 完整回答: - 开头解释概念。 - 详细说明执行次数和原因。 - 提供代码示例。 - 结尾添加相关问题。 代码示例:基于引用[5],但简化。</think>### Java静态代码块实例代码块执行次数的区别及原因 在Java中,静态代码块和实例代码块是两种不同的初始化机制,它们在执行次数上存在显著差异。下面我将逐步解释这些区别、原因,并通过示例进行说明。回答基于Java的类加载和对象创建机制(参考JVM规范),并结合了相关引用内容。 #### 1. **基本定义** - **静态代码块**:使用`static { ... }`语法定义,用于初始化静态变量或执行类级别的操作(如加载配置文件)。它在类被加载到JVM时执行一次,且仅执行一次[^1][^2][^4]。 - **实例代码块**:使用`{ ... }`语法定义(也称普通代码块或构造代码块),用于初始化实例变量或执行对象级别的操作。它在每次创建对象时执行,且在构造方法之前运行[^1][^2][^4]。 #### 2. **执行次数差异** - **静态代码块**:执行次数为**一次**,无论创建多少个对象。例如,如果类加载后创建10个对象,静态代码块只运行一次。 - **实例代码块**:执行次数为**多次**,每次创建新对象时都会执行一次。例如,创建10个对象,实例代码块会运行10次。 **关键区别总结**: | 特性 | 静态代码块 | 实例代码块 | |--------------|----------------------------|----------------------------| | 执行次数 | 一次(类加载时) | 多次(每次对象创建时) | | 语法 | `static { ... }` | `{ ... }` | | 执行时机 | 类加载时,早于`main`方法 | 构造方法之前,每次`new`时 | | 访问变量范围 | 只能访问静态变量 | 可访问实例变量和静态变量 | #### 3. **原因分析** 执行次数的差异源于Java的类加载和对象创建机制: - **静态代码块执行一次的原因**:静态代码块类本身关联,而非对象。当JVM首次加载类时(例如,通过`Class.forName()`或首次`new`对象),类信息被加载到方法区,静态代码块随即执行并完成初始化。之后,无论创建多少对象,类已加载,无需重复执行[^2][^4]。这确保了静态资源的效率,例如加载全局配置(如数据库连接)只需一次。 - **实例代码块执行多次的原因**:实例代码块对象实例关联。每次使用`new`关键字创建对象时,JVM在堆中分配内存,并在调用构造方法前自动执行实例代码块。这为每个对象提供了独立的初始化机会,例如设置实例变量的默认值[^1][^4][^5]。数学上,如果创建$n$个对象,实例代码块执行次数为$n$次。 根本原因在于JVM内存管理: - 静态代码块存储在方法区(类元数据区),生命周期类相同。 - 实例代码块作为对象构造的一部分,存储在堆中,生命周期对象绑定。 #### 4. **代码示例演示** 以下示例展示了执行顺序和次数差异(基于引用[5]简化): ```java public class Example { // 静态代码块执行一次) static { System.out.println("静态代码块执行"); } // 实例代码块执行多次) { System.out.println("实例代码块执行"); } // 构造方法 public Example() { System.out.println("构造方法执行"); } public static void main(String[] args) { System.out.println("main方法开始"); new Example(); // 第一次创建对象 new Example(); // 第二次创建对象 } } ``` **输出结果**: ``` 静态代码块执行 main方法开始 实例代码块执行 构造方法执行 实例代码块执行 构造方法执行 ``` **解释**: - 静态代码块在类加载时最先执行(仅一次)。 - `main`方法启动后,每次`new Example()`都会先执行实例代码块(两次),再执行构造方法。 - 这验证了执行顺序静态代码块 → 实例代码块 → 构造方法,且静态代码块只运行一次[^1][^2][^4]。 #### 5. **实际应用场景** - **静态代码块**:适合初始化静态资源(如日志配置、数据库驱动加载),避免重复开销。 - **实例代码块**:适合对象级别的初始化(如设置实例变量默认值),确保每个对象状态一致。 总之,执行次数差异由Java的类加载机制决定:静态代码块服务于类级别,实例代码块服务于对象级别。理解这一点有助于优化资源使用和避免初始化错误[^3][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值