在单一类中:
执行顺序为:(静态变量、静态代码块)(同声明的先后顺序有关)-->(非静态变量、非静态代码块)(同声明的先后顺序有关)--> 构造方法
在有继承关系的子父类中
执行顺序为:(父类静态变量、父类静态代码块)(同声明的先后顺序有关)-->(子类静态变量、子类静态代码块)(同声明的先后顺序有关)-->(父类非静态变量、父类非静态代码块)(同声明的先后顺序有关)-->(父类构造方法)-->(子类非静态变量、子类非静态代码块)(同声明的先后顺序有关)-->(子类构造方法)
代码部分
package com.atguigu.java; //静态变量和静态代码块、成员变量和普通代码块、构造器加载顺序总结 public class StaticDemo { public static String s = "父类静态变量"; static { System.out.println(s); String ss = "父类静态代码块"; System.out.println(ss); } public StaticDemo(){ System.out.println("父类构造器"); } public String sss = "父类非静态变量"; { System.out.println(sss); String ssss = "父类普通代码块"; System.out.println(ssss); } } class StaticDemo1 extends StaticDemo{ public static String m = "子类静态变量"; static{ System.out.println(m); String mm = "子类静态代码块"; System.out.println(mm); } public StaticDemo1(){ System.out.println("子类构造器"); } public String mmm = "子类非静态变量"; { System.out.println(mmm); String mmmm = "子类普通代码块"; System.out.println(mmmm); } }
测试部分
package com.atguigu.java; public class StaticTest1 { public static void main(String[] args){ StaticDemo1 sd = new StaticDemo1(); } }
结果
父类静态变量 父类静态代码块 子类静态变量 子类静态代码块 父类非静态变量 父类普通代码块 父类构造器 子类非静态变量 子类普通代码块 子类构造器
对上面的代码块和变量顺序稍作修改,就会发现结果会变得不同。