类加载过程
1,Loading
双亲委派(可查看这篇文档https://blog.csdn.net/jt781861965/article/details/114560791?spm=1001.2014.3001.5501)
2,Linking
2.1,Verification
验证文件是否符合JVM规定
2.2,Preparation
静态成员变量赋默认值
2.3,Resolution
将类、方法、属性等符号引用解析为直接引用
常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用
3,Initializing
调用类初始化代码 ,给静态成员变量赋初始值
下面我还写来了一个小测试,具体运行结果都有标注
代码结构
源码
package com.myspringboot.jvm.loader;
public class ATest {
static final int I = 5;
static int j = 11;
static {
System.out.println("ATest");
System.out.println("j = " + j);
}
}
package com.myspringboot.jvm.loader;
public class BTest extends ATest {
static {
System.out.println("BTest");
}
}
package com.myspringboot.jvm.loader;
/**
* 类加载过程的测试
*/
public class LazyLoadingTest {
public static void main(String[] args) throws Exception {
// ATest a; //不会打印(没有加载完成)
// ATest a =null;//不会打印(没有加载完成)
// System.out.println(ATest.I);//打印出5(没有执行静态块,未加载完成)
// System.out.println(ATest.j);//打印出ATest,j = 11,11(静态变量赋初始值,已加载完成)
// Class.forName("com.myspringboot.jvm.loader.ATest");//打印出ATest,j = 11(执行静态块,已加载完成)
// Class.forName("com.myspringboot.jvm.loader.BTest");//打印出ATest,j = 11,BTest(执行静态块,已加载完成)
// BTest x = new BTest();//打印出ATest,j = 11,BTest(实例化父子类,已加载完成)
}
}