类加载器主要就是把字节码文件加载到内存当中,生成大的Class实例
1. ClassLoader只负责class文件的加载,至于它是否可以运行,由Execution Engine决定
2. 加载的类信息存放在方法区(永久代/元空间)中,里面还存放运行时常量池信息。
类加载过程
加载:将字节码文件转换为二进制字节流转换为运行时数据结构,生成一个大的Class文件
链接:
验证:确保大Class文件的字节流包含信息是正确的
准备:给类变量分配内存(在方法区中),赋默认值。(不包括final修饰的static,final修饰的在编译阶段就会分配了,在这里会进行显视初始化)
解析:常量池内的符号引用转换为直接引用的过程
初始化:执行类构造器<clinit>方法(不是我们知道的类构造器方法),主要是为静态变量赋值,如果不存在静态变量,我们在字节码文件中就看不到这个clinit方法。
由于按照顺序执行,所以最后的num值是10。因为在类加载的链接准备阶段就已经为类变量分配内存且设置初始值了,所以不会报错。