JVM加载类过程:
1.加载:
- 类字节码文件从硬盘读入到内存中
- 类加载器(BootStrapClassLoader,ExtensionClassLoader,SystemClassLoader)加载字节码文件 在方法区存放生成类对应的Class对象
---------
2.连接
这个过程又包括了:验证、准备、解析
- 验证:对class等进行验证的过程;
- 准备阶段:为静态变量开辟内存空间并赋上默认初始值;
- 解析:符号化链接解析成实际链接(调用对象方法符号表示转变为方法的实际地址)
----------
3.初始化
- 执行静态成员的初始化语句(为在连接部分中的准备阶段中已经分配内存空间和赋上默认值的静态成员赋值)
- 执行静态语句块
类加载过程是先加载父类,然后再加载子类
类加载完毕后,如果要进行对象实例化就需要执行:
父类非静态成员初始化语句(包括代码块,按照在类定义中的顺序执行)->父类构造函数->子类非静态成员初始化语句(包括代码块,按照在类定义中的顺序执行)->子类构造方法
下面是总结的一个顺序,比较清楚:
有父类的情况
1. 加载父类
1.1 为静态属性分配存储空间并赋初始值
1.2 执行静态初始化块和静态初始化语句(从上至下)
2. 加载子类
2.1 为静态属性分配存储空间
2.2 执行静态初始化块和静态初始化语句(从上至下)
3. 加载父类构造器
3.1 为实例属性分配存数空间并赋初始值
3.2 执行实例初始化块和实例初始化语句
3.3 执行构造器内容
4. 加载子类构造器
4.1 为实例属性分配存数空间并赋初始值
4.2 执行实例初始化块和实例初始化语句
4.3 执行构造器内容