使用断点调试跟踪子类对象实例化过程中代码的执行顺序

可以根据断点调试跟踪代码运行的顺序,了解子类实例化对象的代码执行过程

以下面的代码作为实例:

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步才完成初始化,运行的顺序由代码后的注释标出

通过运行的顺序我们可以总结出

  • 父类的构造函数(显示或隐式)先于子类构造
  • 域变量的显式初值初始化(或默认初始化)先于构造函数中对成员变量初始化

猜你喜欢

转载自blog.csdn.net/qq_51800570/article/details/121163616
今日推荐