对象new的步骤:
- 虚拟机遇到new指令的时候,首先在常量池中定位这个类的符号引用
- 如果当前类存在父类,检查父类有没加载,加载父类,执行父类的静态字段,静态代码块
- 加载当前类的静态字段,静态代码块
- 开始执行new指令,如果存在父类,子类对象要完成初始化,首先要对父类对象进行初始化,所有构造函数第一行隐式执行了super()语句,先对父类对象进行初始化,(默认初始化,构造代码块,显式初始化(也就是构造函数内的初始化)),再对子类对象进行初始化
流程图如下:
注意点:
- 在父类构造器中,语法上是允许调用子类重写的方法,但是要禁止这种写法,是因为此时子类还没有完成初始化,执行子类重写的方法可能出现问题。
- 在父类构造器中,sout(this),显示的是子类对象的引用,但是this.field执行却是父类的字段