类的生命周期
1. 加载
根据类的全限定名把字节码文件的内容加载并转换成合适的数据放入到内存中
2. 链接
验证:
魔数 , 版本号等验证, 一般不需要程序员关注
准备:
为静态变量分配内存并设置初始值
解析:
将常量池中的符号引用(编号) 替换为直接引用(内存地址)
3. 初始化
执行静态代码块和静态变量的赋值
几个要点:
- 静态变量的定义使用final关键字, 这类变量会在准备阶段直接进行初始化(除非要执行方法)
- 直接访父类的静态变量, 不会触发子类的初始化。
- 子类的初始化clinit调用之前, 会先调用父类的clinit初始化方法
添加-XX:+TraceClassLoading参数可以打印出加载并初始化的类