看以下代码:
class A { static { System.out.println("A的static代码块..."); } public String s1 = prtString("A的成员变量..."); public static String s2 = prtString("A的static变量..."); protected A() { System.out.println("A的构造函数..."); } { System.out.println("A的代码块"); } public static String prtString(String str) { System.out.println(str); return null; } } class B extends A { public String ss1 = prtString("B的成员变量..."); public static String ss2 = prtString("B的static变量..."); public B() { System.out.println("B的构造函数..."); } static { System.out.println("B的static代码块..."); } { System.out.println("B的代码块..."); } } public class Test { public static void main(String[] args) { System.out.println("主函数运行"); B b=new B(); } }
运行结果:
由上可以得出运行顺序:
1. 父类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
2. 子类静态成员和静态初始化块 ,按在代码中出现的顺序依次执行
3. 父类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
4. 父类构造方法
5. 子类实例成员和实例初始化块 ,按在代码中出现的顺序依次执行
6. 子类构造方法
顺序是:当创建类对象时,先初始化静态变量和静态块,然后是非静态变量和非静态代码块,然后是构造器。由于静态成员只会被初始化一次,所以如果静态成员已经被初始化过,将不会被再次初始化
参考文章:
https://blog.csdn.net/lichuangcsdn/article/details/80862036
https://www.cnblogs.com/ipetergo/p/6852790.html