请各位帮忙!!
现有三个类:AA类,BB类,CC类。代码如下:
public class AA {       //   此处为1
public static int a=10;   //此处为2
}
public class BB extends AA {     //此处为3
public static int x=30;    //此处为4
}
public class CC {
public static void main(String[] args) {
BB b=new BB();   //此处为5
}
}在5那里设断点,按F5调试,执行顺序为:5→2→1→4→3 
请问从2至1的原因?

解决方案 »

  1.   

    public class AA { // 此处为1 
    public static int a=10; //此处为2
    }
    public class BB extends AA { //此处为3 
    public static int x=30; //此处为4
    }
    public class CC { 
    public static void main(String[] args) {
    BB b=new BB(); //此处为5
    BB b1 =  new BB() ;// 此处为6
    }
    }
    1、肯定先执行5,因为CC为启动类,main方法;
    2、new BB()时,会加载BB类,而BB类有父类AA(非Object父类),所以加载AA,在加载AA的时,jvm会经过 加载、验证连接 、初始化静态变量 ,所以执行2 
    3、然后new  BB()对象时,需要初始化父类AA的非静态变量,所以重新运行AA类,所以 1
    4、做完父类的加载和初始化非静态变量后,接着jvm装载BB类,和AA类一样,先初始化BB类的静态类变量,所以 4;
    5、接着初始化非静态变量 ,所以3 ;注 :如果再写一个 new BB()的话,即6哪里 的运行顺序应该为 6 ->1 ->3
    因为 5的时候jvm已经对AA和BB进行加载并对类的静态类变量初始化 ,所以不在做 ;
      

  2.   

    类的静态变量 是在类在被jvm加载的时候初始化的,而不是在 创建对象的时候,如果创建对象的时候 ,类还没被jvm加载,那么需要加载,只有加载完成后才能创建对象 所以静态变量总是先于非静态变量初始化 ,因为非静态变量初始化是要在创建对象的时候才做 ;
    创建子类对象 ,jvm会加载父类,并初始化父类的静态变量 ;创建子类对象时 ,会先初始化父类的非静态变量 ,然后运行父类的构造函数 ,接着初始化其非静态变量 在运行其构造函数 ;
      

  3.   

    【我补全一点:】现有三个类:AA类,BB类,CC类。代码如下:
    public class AA {//   此处为1
    public static int a=10;//此处为2
            public int b=20;   //此处为6
            public AA(){};    //此处为7
    }
    public class BB extends AA {//此处为3
    public static int x=30;//此处为4
            public int y=40;      //此处为8
            public BB(){};     //此处为9
    }
    public class CC {
    public static void main(String[] args) {
    BB b=new BB();//此处为5
    }
    }在5那里设断点,按F5调试,执行顺序为:5→2→1→4→3→5→9→7→6→8→5 
    请问从2至1的原因?
      

  4.   

    建议楼主看看java中的类是怎么构建完成的
      

  5.   


    new BB()时,会加载BB类,而BB类有父类AA(非Object父类),所以加载AA,在加载AA的时,jvm会经过 加载、验证连接 、初始化静态变量 ,所以执行2  
    然后new BB()对象时,需要初始化父类AA的非静态变量,所以重新运行AA类,所以 1