今天在做牛客网上的题时,注意到了一个题是关于静态对象的初始化的问题
之前发现类加载的顺序是 :
父类的静态代码块和静态对象->子类的静态代码块和静态对象->父类非静态代码块和对象->父类构造函数->子类非静态代码块和对象->子类构造函数
今天做这个题时,立马根据上面的顺序排出掉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();)
由上面的对比发现,如果一个类里面有静态的初始化的对象,则首先执行非静态代码块,然后再是静态代码块,之后的就和正常一样。注意静态代码块只执行一次。