初始化阶段

 

初始化

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

大厂笔试题:

notion image
notion image