要弄清楚这个问题,就必须知道“构造代码块”产生的原因,以及其本质。
构造代码块:多个构造方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行。
也就是说,实际上构造代码块中的内容其本质还构造方法中的一部分,创建对象时的入口还是构造方法。
本质上,构造代码块中与构造方法是一体的,构造代码块中的内容,体现在构造方法当中的位置应该是在
super();语句与构造方法内容之间的那部分内容
(注:见附图“构造代码块中的内容体现在构造方法当中应该是这样.png”)
那么当创建类的对象的时候,就会调用类的构造方法,首先执行其公共的部分,也就是“构造代码块”当中的内容。
回到子类继承父类,并创建对象的这个题中,执行流程应该是这样:
1、将父类的.class文件加载进方法区,父类静态代码块随之执行
2、将子类的.class文件加载进方法区,子类静态代码块随之执行
3、创建子类对象,默认访问父类的构造方法,父类的构造代码块执行,父类的构造方法执行
4、访问子类的构造方法,子类的构造代码块执行,子类的构造方法执行
5、子类对象创建完毕
(注:见附图“执行流程.png”) |
|