类里含有静态初始化对象的执行过程和顺序

来源:互联网 发布:软件测试就业培训 编辑:程序博客网 时间:2024/05/22 13:00

今天在做牛客网上的题时,注意到了一个题是关于静态对象的初始化的问题

之前发现类加载的顺序是 :

父类的静态代码块和静态对象->子类的静态代码块和静态对象->父类非静态代码块和对象->父类构造函数->子类非静态代码块和对象->子类构造函数


今天做这个题时,立马根据上面的顺序排出掉A和B,结果查看答案瞬间傻眼了,于是就自己在eclipse测试了一下

实验代码:

package com.xaut.cherry.niukewang0702;


public class StaticMethodConstructor {                                //  (3)     (9)     (12)

static StaticMethodConstructor ex1 = new StaticMethodConstructor();             //   (4)   
{
System.out.println("block D");                                   //加断点处  (1)      (10)
}
static{
System.out.println("block C");                                                                           //  (5)
}
{
System.out.println("block A");                                //    (2)             (11)
}
static {
System.out.println("block B");                                                                         //  (6)
}

public static void main(String[] args) {
// TODO Auto-generated method stub

System.out.println();                                                                                        //  (7)
StaticMethodConstructor example = new StaticMethodConstructor();  //  (8)     (13)
}      //  (14)结束


}

为了看的明白,多写了几个静态代码块和非静态代码块

实验结果:


并且用debug进行调试,发现:

发现该段程序的执行顺序如右边标注的数字所示。

对于该类,首先执行的是两个非静态代码块,然后再进入该类,执行静态对象的定义和初始化,按顺序执行静态代码块,再到main函数里面先执行输出空行,再是一般对象的初始化,最后再执行两个非静态的代码块。

但是当我把类里面的定义静态对象那行注释掉之后,发现执行的顺序和最上面的那个顺序一致

实验结果:(// static StaticMethodConstructor ex1 = new StaticMethodConstructor();)


由上面的对比发现,如果一个类里面有静态的初始化的对象,则首先执行非静态代码块,然后再是静态代码块,之后的就和正常一样。注意静态代码块只执行一次。

原创粉丝点击