# class-initialization-order
**Repository Path**: geekccyang/class-initialization-order
## Basic Information
- **Project Name**: class-initialization-order
- **Description**: 该项目包含了Java的类初始化顺序,静态代码块等执行顺序。
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2018-09-28
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# class-initialization-order
Three cases understanding class initialization order
#### InitClass.java
执行过程:
1. new B1()时,JVM需要加载B1.class字节码文件,此时会先初始化静态变量和静态代码块,按照自上而下的方式依次初始化。静态代码块只在加载class文件时执行一次。
2. 然后执行B1的构造函数
#### InitClass2.java
执行过程:
1. new B2()时,JVM需要加载B2.class字节码文件,此时会先初始化静态变量和静态代码块,按照自上而下的方式依次初始化。静态代码块只在加载class文件时执行一次。
2. 当静态代码块执行过一次,静态变量也初始化完成以后,先调用构造函数的第一行super()执行父类的构造函数,然后开始自上而下初始化全局变量。
3. 然后执行B2的构造方法内容。
#### InitClass3.java
当 B3继承A3时,执行过程:
1. new B3()时,JVM需要加载B3.class字节码文件,此时会先初始化静态变量和静态代码块,按照自上而下的方式依次初始化。静态代码块只在加载class文件时执行一次。
2. 当静态代码块执行过一次,静态变量也初始化完成以后,先调用构造函数的第一行super()执行父类的构造函数,然后开始自上而下初始化全局变量。
3. 最后执行B2的构造方法内容。