加载
- 先说下类加载器(ClassLoader):java类经过编译生产.class文件。JVM通过类加载器读取类的二进制流,然后在做其他操作。类加载器主要有引导类加载器、扩展类加载器、应用程序类加载器。每次加载一个用户的类都是先判断是否加载,过然后逐层请求父类加载器去获取,如果父类获取不到该类,则交给子类去加载。这种模式称为双亲委派模型。好处:1.避免重复加载。2.保证系统安全性,防止被核心库被替换。
- 使用类加载器来加载。将类信息存放到元空间,然后在堆中实例化Class对象,最为元空间类的入口。
连接
验证
- 验证类是否符合java规范。
准备
- 为变量赋默认值。只有final+static修饰的变量才会赋显示的初始化值。其他变量都只会赋默认值。
1
2
3
4//这里只有num3会赋值1,其他都是0
private static int num = 1;
private static int num2;
private static final int num3 = 1;
- 为变量赋默认值。只有final+static修饰的变量才会赋显示的初始化值。其他变量都只会赋默认值。
解析
- 将常量池(元空间)中的符号引用替换为直接引用的过程。
初始化
- 只有主动使用类才会执行初始化。
1
2
3
4
5
6
7
8
9
10
11//初始化顺序
父类--静态变量
父类--静态初始化块
子类--静态变量
子类--静态初始化块
父类--变量
父类--初始化块
父类--构造器
子类--变量
子类--初始化块
子类--构造器
- 只有主动使用类才会执行初始化。
使用
卸载
- finalize()