【同一个类只会加载一次,不会重复加载】
1. 加载: 把当前class类模板放入到对应的方法区的实现中(元空间/方法区),并且创建对应的class对象放入到堆中。(每个class中都有一个常量池记录: 类名/方法名/参数类型 的符号引用,基本类型的参数会在此阶段进行赋值)
符号引用: 就是一种临时的表示方式,没有对应具体的实体指向。
2. 链接: 又分为三个阶段
2.1 验证: 检查当前类的语法是否正确,版本是否对应等等。
2.2 准备: 为静态变量分配空间对应的空间并赋予默认值。但静态常量在编译阶段就分配了内存空间,在此阶段进行赋值。
2.3 解析: 就是把class中的常量池对应的符号引用 转变 为直接引用【使用的运行时常量池也叫动态链接】,即指向准备阶段中分配的内存空间。
3. 初始化:
简单来说就是为类的静态变量赋予正确的初始值 (使用的空间是准备阶段中分配的内存空间)。
初始化阶段其实就是执行所有静态成员和静态代码块。 执行这个是从上向下执行,没有优先级
如果有父类则会先进行加载父类。
不会触发此类的初始化:
1. 调用父类中的静态变量且没有在本类中写这个变量
2. 通过数组定义的类引用
3. 调用此类的静态常量
4. 使用ClassLoder类的LoadClass()方法加载一个类