java 记录一个类加载顺序的坑

本文详细解析了Java中类加载与初始化的过程,通过一个具体示例,展示了静态与非静态成员变量、静态代码块、构造方法及静态方法的执行顺序。揭示了类初始化时,静态成员变量和静态代码块的执行时机,以及它们如何影响类的实例化。

看看这个,先想想结果打印的顺序和a、b的值

public class ClassLoderTest {
    public static void main(String[] args) {
        staticFun();
    }

    static ClassLoderTest clt = new ClassLoderTest();

    static {
        System.out.println(1);
    }
    {
        System.out.println(2);
    }
    ClassLoderTest(){
        System.out.println(3);
        System.out.println("a="+a);
        System.out.println("b="+b);
    }
    public static void staticFun(){
        System.out.println(4);
    }
    int a = 11;
    static int b = 12;
}

如果有人想的答案是以打印1开头,或者b=12的,就都错了

正确答案:
2
3
a=11
b=0
1
4
原因:

就是先静态初始化本类实例,那么后面的静态初始化都会等到这个实例化完成才会执行。
详细过程是这样的:
1、调用main方法,触发类的静态初始化
2、第一个静态变量是ClassLoderTest类本身,于是就执行new ClassLoderTest()初始化
3、由于这个没执行完,后面的静态代码块和静态变量就先等等
4、既然是类的初始化,那就先执行普通代码块,打印出2
5、再初始化成员变量,a=11,但b因为是静态变量,并没有赋值,所以这时b=0
6、再执行构造方法,打印出3,a=11,b=0,此时类初始化完成
7、这时才执行后面的静态初始化,于是执行到静态代码块,打印出1
8、再初始化静态变量b,此时b=12
9、所有初始化都完成,最后再调用main方法中的静态方法,打印出4

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值