类加载的生命周期有加载 ->连接->初始化->使用->销毁
加载
加载:类加载器获取二进制信息(本地,动态代理,网络传输)放入方法区(虚拟概念)生成InstanceKlass对象保存类信息类,同时堆中也会存放一份,并且相互关联,方法区是使用c++处理的结果,堆区是使用java包装后的结果,同时堆区的内容的内容更少(为了安全,减少访问范围),省略一些无法操作的数据,jdk8之后会将静态字段存放入堆区
连接 校验->准备->解析
连接
校验 :程序员不参与(java虚拟机规范)
准备 :为静态变量分配内存,设置初值,final修饰的会直接赋值(初始化)指向常量池
解析 :将常量池中的符号引用(常量池编号)转换为直接引用(内存)
初始化
初始化 :执行静态代码块,字节码中的clinit方法,为静态变量赋值,clinit和静态代码块的执行顺序和编写顺序相同,直接访问父类静态变量不会初始化子类,反之会初始化父类,
注:访问静态变量,方法,反射会默认初始化类(可修改),new,Main方法所在类均会加载类,调用final修饰的静态变量不会加载类,每一次创建新变量时都会加载一次?
补充:
//jvm操作规范,未被初始化的类在初始化时会被初始化,静态代码块在类初始化阶段执行,会被执行两次,但是类只会加载一次
/**
* every time you create a new object of a class in Java,the class is initialized.
* This is because the class constructor is called
* when a new object is created, and the constructor is responsible
* for initializing the object's state。
* not every time you create a new object of a class in Java,the class is loaded.
* This is because the class is only loaded once when it is first used.
*/