今天在某客上看见这么一道题,考察的是类加载过程中的一些执行的先后顺序。在此之前,我一直以为静态块一直都是最先加载执行的,所以看见这类题都会先把静态块不是第一位的排除,但是答案却是构造块--构造块--静态块--构造块。
public class B
{
public static B t1 = new B();
public static B t2 = new B();
{
System.out.println("构造块");
}
static
{
System.out.println("静态块");
}
public static void main(String[] args)
{
B t = new B();
}
}
看了讨论区大佬总结如下:
首先静态块并不是永远第一个被加载的,静态域才是,而静态域中又包含静态变量,静态块,静态方法,静态域内部的执行顺序是按照程序上下顺序来分的。
我们都知道类加载过程中静态变量如果不是final常量的话是会在类加载过程中先赋初值的,而不是直接赋值(如这里会先赋值为null,而不是对象B的实例),类加载首先会加载静态域,这里静态变量是在静态块之前的,所以这里加载顺序应该最先是静态变量,静态变量赋初值null会用到构造方法和构造块,并且构造块永远在构造方法之前执行,因此会先完成两个静态变量的赋值操作,也就是会执行两次构造块,然后就是执行静态域中的静态块,最后在main函数中还有一个赋值操作,因此又会执行一次构造块。所以最终的执行顺序是构造块--构造块--静态块--构造块。