代码改变世界

一起探索下java的类初始化顺序

2017-07-23 21:32  猪牙哥  阅读(155)  评论(0编辑  收藏  举报

一个java类里面有代码块、变量、构造方法,而代码块和变量都有静态和非静态,它们的初始化顺序又是怎样的呢,是否跟编写的先后顺序有关?

1⃣️先上代码

public class InitTest {
    
    private int a=a();
    
    private static int b=b();
    
    {
        System.out.println("初始化非静态代码块");
    }
    
    static {
        System.out.println("初始化静态代码块");
    }
    
    public InitTest(){
        super();
        System.out.println("初始化构造方法");
    }
    
    private int a(){
        System.out.println("初始化非静态变量");
        return 0;
    }
    
    private static int b(){
        System.out.println("初始化静态变量");
        return 0;
    }
    
}

执行结果:

初步分析是先初始化静态的,在初始化非静态,最后才是构造方法。

最后我们分析一下,如果都是静态或者都是非静态,究竟是先初始化代码块先还是变量先。

ok,还是先上代码,这里我只演示都是静态的

public class InitTest {
    
    private static int a=a();
    static {
        System.out.println("初始化静态代码块");
    }

    private static int b=b();
    
    private static int a(){
        System.out.println("初始化静态变量a");
        return 0;
    }
    
    private static int b(){
        System.out.println("初始化静态变量b");
        return 0;
    }
    
}

执行结果

由这里可以看到,同时静态,初始化顺序是由编译是代码从上到下

了解一个类的初始化顺序在开发中是非常非常重要的 

补充一下,如果有父类并且子类有调用super(...),那么就会先初始化父类再初始化子类