初始化
- 初始化阶段会执行静态代码块中的代码, 并为静态变量赋值
- 初始化阶段会执行字节码文件中clinit部分的字节码指令
clinit方法中的执行顺序与Java中编写的顺序是一致的
- 以下几种方式会导致类的初始化:
- 访问一类的静态变量或者静态方法, 注意:final修饰的并且等号右边是常量不会触发初始化
- 调用 Class.forName(String className)
- new一个该类的对象时
- 执行Main方法的当前类
- clinit指令在特定情况下不会出现, 如:如下几种情况是不会进行初始化指令执行的
- 无静态代码块且无静态变量赋值的语句
- 有静态变量的声明, 但是没有赋值语句
- 静态哦变量的定义使用final关键字, 这类变量会在准备阶段直接进行初始化
- 直接访问父类的静态变量不会触发子类的初始化
- 子类的初始化clinit调用之前, 会调用父类的clinit初始化方法