可以根据断点调试跟踪代码运行的顺序,了解子类实例化对象的代码执行过程
以下面的代码作为实例:
class AddClass {
private int x=0,y=0,z=0; //6
AddClass (int x) { //5
this.x=x; //7
}//8
AddClass (int x,int y) {
this(x); //4
this.y=y; //9
} //10
AddClass (int x,int y,int z) {
this(x,y); //3
this.z=z; //11
} //12
}
public class SonAddClass extends AddClass{
int a=0,b=0,c=0;//13
SonAddClass (int x) {
super(x); a=x+7;
}
SonAddClass (int x,int y){
super(x,y); a=x+5; b=y+5;
}
SonAddClass (int x, int y,int z){
super(x,y,z); //2
a=x+4; b=y+4; c=z+4;//14
}//15
public static void main(String[] args){
SonAddClass p1=new SonAddClass (2,3,5); //1 -> 16
}
}
main函数中的p1初始化的这条语句,实则运行了16步才完成初始化,运行的顺序由代码后的注释标出
通过运行的顺序我们可以总结出
- 父类的构造函数(显示或隐式)先于子类构造
- 域变量的显式初值初始化(或默认初始化)先于构造函数中对成员变量初始化