实战理解类的加载顺序(Java)

1. 类的加载顺序

我们都知道类的加载顺序一般遵循:先父类、再子类,先静态变量 / 静态代码块、再普通成员变量 / 非静态代码块。

但这只是一个大概的认识,实际操作往往更能加深我们的理解。

  •  静态变量及其代码块按顺序执行;
  • 非静态变量及其代码块按顺序执行;
  • 成员变量初始化如果会调用构造方法,则会先按顺序初始化一遍实例变量;

2. 代码示例(这里排除父类、子类顺序的测试)

/**
 * <p>Title: StaticTest.java</p>
 * Description: 完美闡述 類的加載順序
 * <p>Copyright: Copyright (c) 2018</p>
 * @author Jack
 * @date 2018年8月14日
 */
public class StaticTest {

	/**
	 * 静态变量/静态代码块 -> 非静态变量/非静态代码块 -> 构造方法
	 */
	public static int k = 0;
    public static StaticTest t1 = new StaticTest("t1");
    public static StaticTest t2 = new StaticTest("t2");
    public static int i = print("i");
    public static int n = 99;
    public int j = print("j");
     
    {
        print("构造块");
    }
     
    static{
        print("静态块");
    }
     
    public StaticTest(String str) {
    	System.out.println("t2:" + t2);
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
        ++n;
        ++i;
    }
     
    public static int print(String str) {
        System.out.println((++k) + ":" + str + " i=" + i + " n=" + n);
        ++i;
        return ++n;
    }
    
    public static void main(String[] args) {
        new StaticTest("init");
    }
}

3.  运行结果

1:j i=0 n=0
2:构造块 i=1 n=1
t2:null
3:t1 i=2 n=2
4:j i=3 n=3
5:构造块 i=4 n=4
t2:null
6:t2 i=5 n=5
7:i i=6 n=6
8:静态块 i=7 n=99
9:j i=8 n=100
10:构造块 i=9 n=101
t2:test.static_test.StaticTest@76ccd017
11:init i=10 n=102

4. 总结

理解清楚上面运行的结果,对类的初始化顺序也就掌握了。

在先父类再子类的原则下,类的初始化顺序我更喜欢表述为:先静态变量/静态代码块、后构造方法,但

构造方法初始化前,先顺序初始化一遍非静态变量/非静态代码块。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值