一个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(...),那么就会先初始化父类再初始化子类