# 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的构造方法内容。