对象初始化的步骤
2017-07-09 本文已影响21人
缄默的石头
对象new的步骤:
- 虚拟机遇到new指令的时候,首先在常量池中定位这个类的符号引用
- 如果当前类存在父类,检查父类有没加载,加载父类,执行父类的静态字段,静态代码块
- 加载当前类的静态字段,静态代码块
- 开始执行new指令,如果存在父类,子类对象要完成初始化,首先要对父类对象进行初始化,所有构造函数第一行隐式执行了super()语句,先对父类对象进行初始化,(默认初始化,构造代码块,显式初始化(也就是构造函数内的初始化)),再对子类对象进行初始化
流程图如下:
![](https://github.com/sd1990/images/blob/master/%E5%AD%90%E7%B1%BB%E5%88%9D%E5%A7%8B%E5%8C%96%E8%BF%87%E7%A8%8B.jpg?raw=true)
注意点:
- 在父类构造器中,语法上是允许调用子类重写的方法,但是要禁止这种写法,是因为此时子类还没有完成初始化,执行子类重写的方法可能出现问题。
- 在父类构造器中,sout(this),显示的是子类对象的引用,但是this.field执行却是父类的字段