类的加载顺序

如下,是牛客上的一道关于类加载的Java题目,问打印结果:

public class Test
{
    public static Test t1 = new Test();
    {
         System.out.println("blockA");
    }
    static
    {
        System.out.println("blockB");
    }
    public static void main(String[] args)
    {
        Test t2 = new Test();
    }
 }
 //输出结果:
//blockA
//blockB
//blockA

解题点:
1.类在加载时首先执行静态对象和静态代码块,然后是非静态对象和非静态代码块,然后是构造函数。
2.当有多个静态对象和静态代码块时,程序会按照从前到后的顺序依次执行。
3.类第一次加载时,还没有new出一个实例的时候,就可以执行静态代码块了。静态对象和静态代码块不依托于实例化对象。

本题执行顺序:
1.首先执行public static Test t1 = new Test();因为它是静态的且在最前面。
2.静态代码块只在第一次加载类时会执行,所以当public static Test t1 = new Test();new 了一个 Test对象时,就不会再执行静态代码块了,即只执行如下代码块,打印“blockA”。

{
    System.out.println("blockA");
}

3.回到第一次加载的Test类,因为静态代码块的优先级比代码块高,且按照在程序中的先后顺序执行,所以接下来要执行如下静态代码块,打印“blockB”。此时该Test类并没有实例化对象,所以上述的打印 A 的代码块并不执行。

static
{
    System.out.println("blockB");
}

4.然后执行 main 方法,在 main 方法中 new 了一个 Test 对象,由于 Test 类中的静态对象和静态代码块都已经执行过一次了,所以此时并不需要再执行静态对象和静态代码块,只需执行实例化对象时的如下代码块,打印“blockA”。

{
    System.out.println("blockA");
}

由上述可得,输出结果为:blockA blockB blockA 。

如有错误或不足之处,敬请指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值