关于静态块,构造块容易混淆的题目

 今天在某客上看见这么一道题,考察的是类加载过程中的一些执行的先后顺序。在此之前,我一直以为静态块一直都是最先加载执行的,所以看见这类题都会先把静态块不是第一位的排除,但是答案却是构造块--构造块--静态块--构造块。

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函数中还有一个赋值操作,因此又会执行一次构造块。所以最终的执行顺序是构造块--构造块--静态块--构造块。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值