1、虚拟机遇到new指令,到常量池定位到这个类的符号引用。
2、检查符号引用代表的类是否被加载、解析、初始化过。(第一次使用该类就需要加载并初始化类)
类初始化过程
- 通过符号引用转化为直接引用得到类的权限定名(确定类的位置)
- 类权限定名通过类加载器确定类的唯一
- 连接
- 验证,验证字节码文件的正确性
- 准备,给类的静态变量分配内存,并赋予默认值是s0tatic
- 解析,类装载器装入引用的其它所有类,将常量池中的
- 初始化,给类的静态变量赋予正确的初始值,执行静态代码块,类最后保存在方法区
3、虚拟机为对象分配内存。
- 分配的内存包括本类和父类的所有实例变量,但不包括任何静态变量
4、虚拟机将分配到的内存空间都初始化为零值。
- 将方法区内对实例变量的定义拷贝一份到堆区,然后赋默认值
5、虚拟机对对象进行必要的设置。对象头
6、执行方法,成员变量进行初始化。
- 初始化顺序是先初始化父类再初始化子类,初始化时先执行实例代码块然后是构造方法
7、将对象的引用指向这个内存区域